PyQt4 - 使用QItemDelegate在QListView中显示小部件

时间:2015-12-08 13:54:02

标签: python qt delegates pyqt4 model-view

我希望有Select T.Treatment_Code, P.First_Name, P.Last_Name, P.Patient_Id From Patients_Treatments T Join Patients P On P.Patient_Id = T.Patient_Id Where T.Patient_Id In ( Select T1.Patient_Id From Patients_Treatments T Join Patients_Treatments T1 On T1.Treatment_Code = T.Treatment_Code And T1.Patient_ID <> T.Patient_Id Where T.Patient_Id = 999 ) 显示自定义小部件。我想最好的方法是QListView。不幸的是,我不太明白如何正确地对它进行子类化以及如何实现QItemDelegate方法,这似乎是最重要的方法。我找不到任何关于使用委托来创建另一个小部件的信息。

我已经尝试在没有委托的情况下实现类似的东西,但是效果不好,因为paint()不应该显示小部件。

QListView

那么,为了做我想做的事,我需要如何实现委托?

1 个答案:

答案 0 :(得分:1)

以下是QTableWidget的示例,其中每行都有一个按钮和文字。我定义了一个add_item方法一次添加一行:插入一个新行,在第0列放一个按钮,在第1列放一个常规项。

import sys
from PyQt4 import QtGui,QtCore

class myTable(QtGui.QTableWidget):      
    def __init__(self,parent=None):
        super(myTable,self).__init__(parent)
        self.setColumnCount(2)

    def add_item(self,name):
        #new row
        row=self.rowCount()
        self.insertRow(row)

        #button in column 0
        button=QtGui.QPushButton(name)
        button.setProperty("name",name)
        button.clicked.connect(self.on_click)
        self.setCellWidget(row,0,button)

        #text in column 1
        self.setItem(row,1,QtGui.QTableWidgetItem(name))

    def on_click(self):
        # find the item with the same name to get the row
        text=self.sender().property("name")
        item=self.findItems(text,QtCore.Qt.MatchExactly)[0]
        print("Button click at row:",item.row())

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)      
    widget = myTable()
    widget.add_item("kitten")
    widget.add_item("unicorn")
    widget.show()
    sys.exit(app.exec_())

加分:如何知道用户点击了哪个按钮?一个按钮没有行属性,但我们可以在实例化按钮时创建一个,如下所示:

button.setProperty("row",row)

问题是,如果您对表进行排序或删除行,则行号将不再匹配。所以我们设置一个&#34;名称&#34;属性,与第1列中项目的文本相同。然后我们可以使用findItems获取行(请参阅on_click)。