class genericTaskList : public QListWidget
{
Q_OBJECT
public:
QListWidgetItem *defaultText;
genericTaskList (QWidget *parentWidget)
{
setParent (parentWidget);
setFixedSize (445, 445);
defaultText = new QListWidgetItem ("Double click here to compose the task");
defaultText->setFlags (defaultText->flags () | Qt :: ItemIsEditable);
insertItem (0, defaultText);
QObject :: connect (this, SIGNAL (currentRowChanged (int)), this, SLOT (addDefaultText (int)));
}
public slots:
void addDefaultText (int rr)
{
std::cout << "\ndsklfjsdklfhsdklhfkjsdf\n";
insertItem (++rr, defaultText);
}
};
此代码应在每次编辑行时发出信号。
在构造函数中调用“ insertItem ”后,将发出信号 但是,就是这样。在此之后永远不会发布 - 无论我编辑行多少次。
我错过了什么?
答案 0 :(得分:3)
起初看起来好像是QListWidget :: itemChanged,但很快就遇到了问题:信号被发送到所有东西 - 插入,删除,更改颜色,复选框等等!因此,您最终会尝试通过截取各种信号来放置标记和过滤器,以查明编辑是否是实际事件。它变得非常混乱。
还有QAbstractItemModel :: dataChanged,这似乎是一个很好的解决方案。它甚至有一个参数“const QVector&amp; 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 :(得分:2)
currentRowChanged
表示行选择已更改,而不是行的内容。也许您想要使用currentTextChanged
或itemChanged
代替。
在QT文档中重复使用 current 和 这个词非常混乱。
答案 2 :(得分:1)
警告:QListWidgetItem只能添加到QListWidget一次。多次向QListWidget添加相同的QListWidgetItem将导致未定义的行为。
所以即使它会发出信号,我认为你最好添加新创建的Item。 你什么时候想要插入新行? - 只要双击项目或完成编辑 - 它们就会不同。