2012-02-23 3 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에만 한 번만 추가 할 수 있습니다. 동일한 QListWidgetItem을 QListWidget에 여러 번 추가하면 정의되지 않은 동작이 발생합니다.

그래서 신호를 방출하더라도 새로 만든 Item을 추가하는 것이 좋습니다. 언제 새 행을 삽입 하시겠습니까? - 두 번 클릭하거나 편집을 마자 마자 - 그들은 다릅니다.

2

처음에는 QListWidget :: itemChanged가 가야 할 길로 보이지만 곧 문제가 생깁니다. 삽입, 제거, 색상 변경, 상자 확인 등 신호가 모두 전송됩니다. 그러면 편집 작업이 실제 이벤트인지 여부를 알아보기 위해 다양한 신호를 가로 채서 어디에서나 플래그를 지정하고 필터링하려고합니다. 그것은 매우 혼란스러워진다.

QAbstractItemModel :: dataChanged도 있습니다. 이는 좋은 해결책으로 보입니다. "const QVector & lstRoles"라는 매개 변수도 있으므로 Qt :: EditRole을 검사하여 실제로 편집되었는지 확인하십시오. 아아, catch가 있습니다. 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

대단히 감사합니다. 파이썬을 사용하는 사람들은 신호 연결 구문을 사용합니다 : myQListWidget.itemDelegate() .commandData.connect (myslot) –