每次在QListWidget中编辑行时如何发出信号?

时间:2012-02-23 09:16:09

标签: c++ qt signals-slots qlistwidget

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

我错过了什么?

3 个答案:

答案 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表示行选择已更改,而不是行的内容。也许您想要使用currentTextChangeditemChanged代替。

在QT文档中重复使用 current 这个词非常混乱。

答案 2 :(得分:1)

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

所以即使它会发出信号,我认为你最好添加新创建的Item。 你什么时候想要插入新行? - 只要双击项目或完成编辑 - 它们就会不同。