2
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 ”后,发出信号。
但是,就是这样。在那之后它永远不会被发布 - 无论我编辑该行多少次。

我错过了什么?

4

3 回答 3

4

起初看起来 QListWidget::itemChanged 是要走的路,但很快你就会遇到一个问题:信号被发送到所有东西 - 插入、删除、更改颜色、复选框等!因此,您最终会尝试通过拦截各种信号来放置标志并在任何地方进行过滤,以查明编辑是否是实际事件。它变得非常混乱。

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

现在您有了一个仅在列表项的文本已被编辑时才被调用的插槽!

于 2015-06-20T20:00:32.100 回答
2

currentRowChanged表示行选择已更改,而不是行的内容。也许您想使用currentTextChangedoritemChanged代替。

QT 文档中单词currentchanged的​​重用是相当混乱的。

于 2012-02-23T09:34:55.677 回答
1

警告:一个 QListWidgetItem 只能被添加到一个 QListWidget 一次。将相同的 QListWidgetItem 多次添加到 QListWidget 将导致未定义的行为。

所以即使它会发出信号,我认为你最好添加新创建的项目。您希望何时插入新行?- 一旦项目被双击或完成编辑 - 它们就不同了。

于 2012-02-23T10:03:01.587 回答