2014-02-26 24 views
1

我正在Qt4.7中工作,并且在我的对话框中有一个QListWidget。我有一个QString,需要匹配该小部件的行中的当前文本(各行可编辑)。看看与QListWidget相关的信号,似乎有信号表示何时选择了不同的索引,但当前选定行的文本更改时没有信号。我认为currentTextChanged(QString)会这样做,但它没有。我也想过尝试连接每个单独的行,但QListWidgetItem没有任何内置信号。有谁知道一种方法来做到这一点?谢谢!Qt - 编辑QListWidget行时的信号?

+0

查看模型 –

+0

@DmitrySazonov的'dataChanged'信号工作,谢谢! – thnkwthprtls

回答

3

我猜你需要考虑以下信号:

void QListWidget::itemChanged(QListWidgetItem * item)

但是因为它被送到每一次项目的某些属性改变,不但文字要小心。我记得当我们改变项目的颜色时,遇到了这个问题,并因此得到了大量的假阳性插槽。如果您需要更好的调整,我想最好自己编写模型/视图类,而不要依赖QListWidget

2

起初看起来好像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.... 
} 

现在你有一个被调用,只有当列表项的文字插槽已编辑!