2010-12-22 36 views
5

我有一个QListWidget这里我想补充了一堆物品的使用自定义窗口小部件:无法更改可检查QListViewItem的状态,自定义部件

 listWidget = QListWidget() 
     item = QListWidgetItem() 
     item.setFlags(item.flags() | Qt.ItemIsUserCheckable) 
     item.setCheckState(Qt.Unchecked) 
     listWidget.addItem(item) 
     widget = MyLabelAndPushButton() 
     item.setSizeHint(widget.sizeHint()) 
     listWidget.setItemWidget(item, widget) 

,顾名思义MyLabelAndPushButton只是包含一个widget QLabel和一个QPushButton。问题是我无法使用出现在小部件旁边的listwidget中的复选框。它看起来完全正常,但是当我点击它时没有任何反应。如果我使用setItemWidget删除该行,它可以正常工作。我究竟做错了什么?

编辑:在bugreports.qt.io/browse/QTBUG-16386

报告的bug,但得到的回答是“API是不适合你打算做什么”和“在情况下,如果你想显示自定义窗口小部件,使用而QListView和子QItemDelegate。 “所以显然这不是一个错误,只是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 2010-12-28 08:25:25

1

The docs for QListWidget::setItemWidget说:

此功能只能用于显示的地方静态内容列表构件的项目。 如果要显示自定义动态内容或实现自定义编辑器小部件,请改为使用QListView和子类QItemDelegate。

“静态内容”我想这意味着非交互式,表明这是使用QListWidget时的已知限制。

+0

好理论,但复选框(由QListWidgetItem本身创建)不适用于非交互式内容,例如QLabel。 – pafcu 2010-12-29 05:56:10

0

它在C++中绝对是一样的,所以不仅仅是一个python/pyqt问题(为了看看我能否找到一个解决方案,现在玩了一段时间)。我第一次以为这是Qt :: ItemIsEnabled返回的旧bug,我们已经在4.2中有过,但事实并非如此。

这是要么按照预期工作,并没有足够的说明在文档(我的+1)或一个错误。

为了确保这一点,我会在https://bugreports.qt.io处提交一个错误,看看他们对此有何评论。

+0

报告的bug在http://bugreports.qt.nokia.com/browse/QTBUG-16386,但得到了回复“API不是为你打算做的事情设计的”和“如果你想要显示自定义小部件,请使用QListView和子类QItemDelegate“。所以显然这不是一个错误,只是API无法处理的东西。 – pafcu 2011-01-05 07:36:15

相关问题