Qt - 编辑QListWidget行时的信号?

时间:2014-02-26 17:43:34

标签: qt qt4 signals qlistwidget

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

2 个答案:

答案 0 :(得分:5)

起初看起来好像是QListWidget :: itemChanged,但很快就遇到了问题:信号被发送给所有东西 - 插入,更改颜色,复选框以及“改变”项目的任何其他内容!普雷德里尼在他的回答中指出了这一点。有些人试图通过拦截各种信号来放置标志和过滤器,以查明编辑是否是实际事件。它变得非常混乱。

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

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

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....
}

现在你有一个只在编辑了列表项的文本时被调用的插槽!

答案 1 :(得分:4)

我想您需要查看以下信号:

void QListWidget::itemChanged(QListWidgetItem * item)

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