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