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もあります。これは良い解決策のようです。パラメータ「constQVector&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....
}

これで、リストアイテムのテキストが編集されたときにのみ呼び出されるスロットができました。

于 2015-06-20T20:00:32.100 に答える
2

currentRowChanged行の内容ではなく、行の選択が変更されたことを示します。currentTextChangedおそらく、またはitemChanged代わりに使用したいでしょう。

QTドキュメントでcurrentおよびchangedという単語を再利用すると、非常に混乱します。

于 2012-02-23T09:34:55.677 に答える
1

警告:QListWidgetItemはQListWidgetに一度だけ追加できます。同じQListWidgetItemをQListWidgetに複数回追加すると、未定義の動作が発生します。

ですから、信号が出たとしても、新しく作成したアイテムを追加したほうがいいと思います。そして、いつ新しい行を挿入しますか?-アイテムをダブルクリックするか、編集を終了するとすぐに-それらは異なります。

于 2012-02-23T10:03:01.587 に答える