2012-02-23 11 views
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); 
     } 
}; 

このコードは、行が編集されるたびに信号を送信することになっています。QListWidgetで行を編集するたびにシグナルを出す方法は?

コンストラクタで "insertItem"を呼び出した後、シグナルが発行されます。
しかし、それだけです。それは何度も行を編集しても、それ以降は決して発行されません。

私には何が欠けていますか?

答えて

3

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

現在のがQTドキュメントのに変更されていることは、かなり混乱しています。

1

警告:QListWidgetItemは、QListWidgetに1回しか追加できません。同じQListWidgetItemをQListWidgetに複数回追加すると、未定義の動作になります。

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

2

最初は、QListWidget :: itemChangedが行く方法ですが、間もなくあなたは問題に遭遇します。シグナルは、挿入、削除、色の変更、ボックスのチェックなど、すべてのために送信されます。したがって、編集が実際のイベントであったかどうかを知るために、さまざまな信号を傍受して、フラグを入れてどこにでもフィルタリングしようとします。それは非常に乱雑になる。

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

今、あなただけのリスト項目のテキスト呼び出されるスロットを持っています編集されました!

+0

ありがとうございました。これをPythonでやっている人には、シグナル接続構文があります:myQListWidget.itemDelegate().commitData.connect(myslot) –

関連する問題