2010-12-22 35 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

相關問題