2014-02-26 4 views
1

Qt4.7에서 작업 중이며 대화 상자에 QListWidget이 있습니다. 나는이 위젯의 ​​행에 현재 텍스트를 매치 할 필요가있는 QString을 가지고있다. (개별 행은 편집 가능하다.) QListWidget과 관련된 신호를 보면, 다른 인덱스가 선택되었을 때 신호가있는 것처럼 보이지만 현재 선택된 행의 텍스트가 변경 될 때 신호가없는 것 같습니다. 나는 currentTextChanged (QString)이 그것을 할 것이라고 생각했지만, 그렇지 않았다. 또한 개별 행을 무언가에 연결하려고 생각했지만 QListWidgetItem에는 기본 제공 신호가 없습니다. 누구든지이 일을 할 수있는 방법을 알고 있습니까? 감사!Qt - QListWidget 행을 편집 할 때의 신호입니까?

void QListWidget::itemChanged(QListWidgetItem * item)

을하지만이 항목의 일부 속성이 아니라 텍스트 변경 때마다 전송되고 있기 때문에주의 :

+0

모델의'dataChanged' 신호를 참조하십시오. –

+0

@DmitrySazonov 그 덕분에, 고마워! – thnkwthprtls

답변

3

나는 다음과 같은 신호로 볼 필요 같아요. 문제가 발생했을 때 항목 색상을 변경하고 그로 인해 호출 된 잘못된 양성 슬롯 수가 많았던 때를 기억합니다. 더 미세 조정이 필요하다면 직접 모델/뷰 클래스를 작성하고 QListWidget에 의존하지 않는 것이 좋습니다.

2

처음에는 QListWidget :: itemChanged가 가야 할 길로 보이지만 곧 문제가 생깁니다. 신호는 삽입, 색상 변경, 상자 확인 및 그 밖의 "변경"을 위해 전송됩니다. 목! Predelnik은 그의 대답에서 그것을 지적했다. 어떤 사람들은 다양한 신호를 가로 채서 편집이 실제 이벤트인지 알아 내기 위해 모든 곳에서 플래그를 지정하고 필터링하려고했습니다. 그것은 매우 혼란스러워진다.

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.... 
} 

만하면 목록 항목의 텍스트 호출되는 슬롯이 있습니다 편집되었습니다!