【问题标题】:QListWidget inside QGraphicsScene not scrolling text itemsQGraphicsScene 中的 QListWidget 不滚动文本项
【发布时间】:2018-05-15 08:38:51
【问题描述】:

我在 QGraphicsScene 中有一个 QListWidget。我在里面添加了带有 QLineEdit 的新项目。当 QListWidget 填充并且滚动条在滚动时处于活动状态时,文本不会滚动,当前项目表示会滚动。

完整代码 Git:code

编辑:

我在水平布局中包含了 QCheckBox,以说明为什么我需要 setItemWidget 函数。

【问题讨论】:

  • Qt 5.3 运行良好。顺便说一句,您的代码显示列表底部的第一项,而不是顶部。
  • 是的,这就是问题所在。我将使用与当前 5.9.4 不同的版本进行测试
  • 那么问题是什么...正如您提到的文本不滚动不是吗? text 和 scroll 都很好用,你除了什么表现?
  • 是的,问题是:如果我移动栏,文本会留在原处。
  • @pazduha 您的代码有错误,要更正它在 mainwindow.h 中的更改将void MyGraphicsView::resizeEvent(QResizeEvent *event); 更改为void resizeEvent(QResizeEvent *event);,即使这样我也可以确认 Qt 5.10.1 中的错误

标签: qt qgraphicsscene qlistwidget


【解决方案1】:

答案:

文本不会滚动,因为setItemWidget 是:

void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)

设置要在给定项目中显示的小部件。此功能仅应用于显示 静态内容 代替 一个列表小部件项目。如果要显示自定义动态内容或 实现自定义编辑器小部件,使用 QListView 和子类 而是 QItemDelegate。

QGraphicsScene 无关紧要。

解决方案:

如果你想让文本可编辑。这比您自定义QItemDelegate 要简单得多。

首先,用编辑触发器设置列表小部件,告诉小部件何时开始编辑。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ...

    ui->listWidget->setEditTriggers(QAbstractItemView::DoubleClicked);
}

然后,当您创建并插入 QListWidgetItem 时,请确保每个项目都是可编辑的。

※替换你整个on_pushButton_clicked函数如下:

void MainWindow::on_pushButton_clicked()
{
    QListWidgetItem* item = new QListWidgetItem("name");
    item->setFlags(item->flags() | Qt::ItemIsEditable);
    ui->listWidget->insertItem(ui->listWidget->currentRow() + 1, item);
}

【讨论】:

  • 这是针对这个特定问题的解决方案。问题是我需要向水平布局添加更多内容,如编辑后的代码(GIT,上面的编辑)所示。我将研究 QListView 和 QItemDelegate。
  • @pazduha 对于这种情况,您需要使用 QListView 并改为子类 QItemDelegate
  • @pazduha 如果您有多列,请使用 QTableView stackoverflow.com/questions/16660292/…
  • 如果你只是想让它们显示为一个列表,为什么不简单地使用带有滚动条的 QLayout 呢?
  • 在我的项目中,我使用 dragDropMode - InternalMove。我想继续使用它,这就是需要 QListView 的原因。 QTableView 可能不适合拖放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多