2010-12-22 4 views
5

가 나는 사용자 정의 위젯 항목의 무리를 추가 할 QListWidget이 사용자 정의 위젯 체크 할 QListViewItem의 상태를 변경할 수 없습니다 레이아웃의 QLabel 및 QPushButton. 문제는 위젯 옆에있는 목록 위젯에 나타나는 확인란을 사용할 수 없다는 것입니다. 완전히 정상적으로 보입니다 만 클릭하면 아무 일도 일어나지 않습니다. setItemWidget을 사용하여 선을 제거하면 올바르게 작동합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 :

보고 bugreports.qt.io/browse/QTBUG-16386에서 버그가 있지만 및 "혹시, 사용자 정의 위젯 표시 QListView과 서브 클래스 QItemDelegate를 사용하려면"당신이하려는 것에 대해 API가 설계되지 않았습니다 "응답을 얻었다. " 따라서 분명히 API가 처리 할 수없는 버그는 아닙니다.

답변

2

정확하게 위젯이 설정되었을 때 목록 항목이 상태를 변경하지 않는 이유가 확실하지 않습니다. 이 문제의 해결 방법은 위젯에 체크 박스를 추가하거나 listwidget의 itemClicked 신호에 연결하고 항목의 상태를 재설정하는 것입니다. Pls는 아래의 예를 들어 당신을 위해 일하는 것이 표시되는 경우이 도움이

import sys 
from PyQt4 import QtGui, QtCore 

class MainForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     listWidget = QtGui.QListWidget() 

     item = QtGui.QListWidgetItem() 
     item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) 
     item.setCheckState(QtCore.Qt.Unchecked) 
     listWidget.addItem(item) 

     widget = QtGui.QCheckBox('test') 
     item.setSizeHint(widget.sizeHint()) 
     listWidget.setItemWidget(item, widget) 

     listWidget.itemClicked.connect(self.on_listWidget_itemClicked) 

     self.setCentralWidget(listWidget) 

    def on_listWidget_itemClicked(self, item): 
     if item.listWidget().itemWidget(item) != None: 
      if item.checkState() == QtCore.Qt.Checked: 
       item.setCheckState(QtCore.Qt.Unchecked) 
      else: 
       item.setCheckState(QtCore.Qt.Checked) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = MainForm() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 

희망,

+0

최후의 수단으로 사용할 수 있지만 차라리 이와 같은 해결 방법을 사용하지 않는 것이 좋습니다. – pafcu

1

The docs for QListWidget::setItemWidget 말에 관하여 :

이 기능은 장소에서 정적 콘텐츠를 표시하는 데 사용되어야한다

목록 위젯 항목. 사용자 정의 동적 컨텐츠를 표시하거나 사용자 정의 편집기 위젯을 구현하려면 QListView를 사용하고 대신 QItemDelegate를 서브 클래스 화하십시오.

"정적 컨텐츠"는 비대화 형을 의미하며 QListWidget을 사용할 때 알려진 제한 사항임을 나타냅니다.

+0

좋은 이론이지만, QListWidgetItem 자체로 생성 된 체크 박스는 QLabel과 같이 비대화 형 콘텐츠에서도 작동하지 않습니다. – pafcu

0

이것은 C++에서 절대적으로 동일하므로 python/pyqt 문제 (해결책을 찾을 수 있는지 여부를 확인하기 위해 한동안 둘러 본 것)가 아닙니다. 나는 이것이 Qt :: ItemIsEnabled와 함께 벌써 우리가 4.2에 가지고 있었던 오래된 버그라고 생각했지만 그렇지 않았다.

이것은 의도 한대로 작동하고 설명서 (이 경우 내 +1) 또는 버그로 충분하지 않습니다.

이것에 관해서는 https://bugreports.qt.io에 버그를 제기하고 이에 대해 그들이 무엇을 말하고 있는지 확인하십시오.

+0

http://bugreports.qt.nokia.com/browse/QTBUG-16386에서 버그가보고되었지만 "API는 의도 한대로 설계되지 않았습니다."및 "사용자 정의 위젯을 표시하려면 다음을 사용하십시오. QListView 및 하위 클래스 QItemDelegate. " 따라서 분명히 API가 처리 할 수없는 버그는 아닙니다. – pafcu

+0

완료 되었습니까? 아니면 QListView 및 QItemDelegate에 대한 도움이 필요합니까? – STiAT