2012-02-23 277 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指示該行選擇發生了變化,該行的不是內容。也許你想用currentTextChangeditemChanged代替。

重複使用字當前改爲在QT文檔中是相當混亂的。

1

警告:QListWidgetItem只能添加到QListWidget中一次。多次將相同的QListWidgetItem添加到QListWidget中將導致未定義的行爲。

所以,即使它會發出信號,我認爲你應該更好地添加新創建的項目。 你想要什麼時候插入新行? - 只要項目被雙擊或完成編輯 - 他們不同。

2

起初好像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.... 
} 

現在你有一個被調用,只有當列表項的文字插槽已編輯!

+0

非常感謝。對於那些使用Python進行這種操作的是信號連接語法:myQListWidget.itemDelegate()。commitData.connect(myslot) – 2016-09-27 15:57:08

相關問題