Qt - 何时编辑 QListWidget 行的信号?

Posted

技术标签:

【中文标题】Qt - 何时编辑 QListWidget 行的信号?【英文标题】:Qt - signal for when QListWidget row is edited? 【发布时间】:2014-02-26 17:43:34 【问题描述】:

我在 Qt4.7 中工作,我的对话框中有一个 QListWidget。我有一个 QString 需要匹配此小部件行中的 current 文本(各个行是可编辑的)。查看与QlistWidget相关联的信号,似乎选择了不同索引的信号,但是当当前所选行的文本更改时,无以来。我认为 currentTextChanged(QString) 会这样做,但事实并非如此。我还想尝试将每一行连接到某个东西,但 QListWidgetItem 没有任何内置信号。有谁知道这样做的方法?谢谢!

【问题讨论】:

查看模型的dataChanged信号 @DmitrySazonov 成功了,谢谢! 【参考方案1】:

起初看起来 QListWidget::itemChanged 是要走的路,但很快你就会遇到一个问题:信号被发送给所有的东西——插入、改变颜色、复选框,以及任何“改变”项目的东西! Predelnik 在他的回答中指出了这一点。一些人试图通过拦截各种信号来到处放置标志和过滤,以查明编辑是否是实际事件。它变得非常混乱。

还有 QAbstractItemModel::dataChanged ,这似乎是一个很好的解决方案。它甚至还有一个参数“const QVector& lstRoles”,因此您可以扫描 Qt::EditRole 并查看它是否真的被编辑过。唉,有一个问题 - 它会像 QListWidget::itemChanged 一样被调用,不幸的是,无论如何,对于 QListWidget,角色参数在被调用时总是空的(我试过了)。这么多的想法......

幸运的是,仍有希望...这个解决方案可以解决问题! :

http://falsinsoft.blogspot.com/2013/11/qlistwidget-and-item-edit-event.html

他使用 QAbstractItemDelegate::closeEditor,但我更喜欢使用 QAbstractItemDelegate::commitData。

所以像这样进行连接......

connect(ui.pLstItems->itemDelegate(), &QAbstractItemDelegate::commitData, this, &MyWidget::OnLstItemsCommitData);

然后像这样实现插槽...

void MyWidget::OnLstItemsCommitData(QWidget* pLineEdit)

        QString strNewText = reinterpret_cast<QLineEdit*>(pLineEdit)->text();
    int nRow = ui.pLstItems->currentRow();
        // do whatever you need here....

现在您有了一个仅在编辑列表项的文本时才被调用的槽!

【讨论】:

不错的解决方案!为我工作。确保在编辑之前选择该项目,否则currentRow()currentItem() 将不会返回您的想法。此外,使用 Escape 键取消编辑时不会调用该插槽。有什么想法吗? 将我的问题移至单独的帖子:***.com/questions/50409139/…【参考方案2】:

我猜你需要查看以下信号:

void QListWidget::itemChanged(QListWidgetItem * item)

但要小心,因为每次更改项目的某些属性时都会发送它,而不仅仅是文本。我记得当我们改变项目颜色并因此调用大量误报槽时遇到问题。如果您需要更多微调,我想最好自己编写模型/视图类,而不是依赖QListWidget

【讨论】:

以上是关于Qt - 何时编辑 QListWidget 行的信号?的主要内容,如果未能解决你的问题,请参考以下文章

QT开发 QListWidget点击返回行号的问题

Qt:如何突出显示 QListWidget 中的重复项? (qtjambi)

QListWidget加入小控件

QT如何放大图标的大小

Qt学习之QListWidget删除Item

Qt 5.7 -> 5.8 将 QIcon 添加到 QListwidget