c++ - 如何通过单击它们在运行时编辑 QListWidget 中的文本?

标签 c++ qt signals-slots

class genericTaskList : public QListWidget
{
    Q_OBJECT  
    public:
        unsigned int rowCounter;

        genericTaskList (QWidget *parentWidget)
        {
            setParent      (parentWidget);
            setFixedSize (445, 445);

            QListWidgetItem *defaultText = new QListWidgetItem ("Double click here to compose the new task.");
            defaultText->setFlags (defaultText->flags () | Qt :: ItemIsEditable);

            rowCounter = 0;
            insertItem (rowCounter, defaultText);

            QObject :: connect (this, SIGNAL (itemDoubleClicked (QListWidgetItem*)), this, SLOT (addDefaultText (QListWidgetItem*)));
            QObject :: connect (this, SIGNAL (itemChanged (QListWidgetItem*)), this, SLOT (addDefaultText (QListWidgetItem*)));
        }

    public slots:
        void addDefaultText (QListWidgetItem*f)
        {
            // Returns the current row number.
            unsigned int currentRow            = row (f);
            // Returns the current row text.
            QString          textOfCurrentRow = f->text ();

            // The new default row should get inserted if and only if, the last row created has been double clicked and its default text has been changed.
            if ((currentRow == rowCounter) 
                && (textOfCurrentRow.toStdString () != "Double click here to compose the new task.") 
                && (textOfCurrentRow.toStdString () != ""))
            {
                ++rowCounter;

                QListWidgetItem *defaultText = new QListWidgetItem ("Double click here to compose the new task.");
                defaultText->setFlags (defaultText->flags () | Qt :: ItemIsEditable);

                insertItem        (rowCounter, defaultText);
                setCurrentRow (rowCounter);
            }
            else if (textOfCurrentRow.toStdString () == "")
            {
                takeItem           (rowCounter);

                QListWidgetItem *defaultText = new QListWidgetItem ("Double click here to compose the new task.");
                defaultText->setFlags (defaultText->flags () | Qt :: ItemIsEditable);
                insertItem        (rowCounter, defaultText);
                setCurrentRow (rowCounter);
            }
        }
};

这里的问题是,当且仅当我双击文本时,我才能编辑文本。单击或其他任何操作均无效。我尝试将该信号从双击更改为单击,但没有帮助。

请指导 - 一直双击很痛苦。

最佳答案

您可以使用 QAbstractItemView::CurrentChanged 作为列表小部件的编辑触发器。这意味着如果您单击一个项目,它将是可编辑的。这不仅适用于单击它,还适用于使用箭头键在项目之间切换。不幸的是,没有“单击编辑”或类似内容的标志......

setEditTriggers( QAbstractItemView::CurrentChanged );

Overview of all triggers

关于c++ - 如何通过单击它们在运行时编辑 QListWidget 中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413645/

相关文章:

c++ - C 风格使用现代 C++ 类

python - 如何选择包含按钮的 QTableWidget 单元格

c++ - 如何在 Qt 信号中使用对抽象类的引用?

c++ - 如何阻止绘画事件传播?

c++ - 我的线程仍然卡住我的 GUI

c++ - Qt 与正在运行的工作线程的通信

C++ 列表逻辑之间的节点删除

c++ - 如何动态确定用于参数化模板的类型并进行比较

c++ - PIC 寄存器 (%ebx) 有什么作用?

Qt Creator-意见和想法