Qt - 编辑QListWidget行时的信号?

thn*_*tls 2 qt signals qt4 qlistwidget

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

Ph0*_*t0n 7

起初看起来好像是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);
Run Code Online (Sandbox Code Playgroud)

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

void MyWidget::OnLstItemsCommitData(QWidget* pLineEdit)
{
        QString strNewText = reinterpret_cast<QLineEdit*>(pLineEdit)->text();
    int nRow = ui.pLstItems->currentRow();
        // do whatever you need here....
}
Run Code Online (Sandbox Code Playgroud)

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