如何有选择地在QTableView中显示QTable CheckBox

时间:2015-01-30 17:12:53

标签: python qt model pyqt qtableview

有两个tableViews:A和B. viewAproxyA相关联。 viewBproxyB相关联。两个代理共享相同的source model

根据我所了解的if Qt.CheckStateRolesource model data()为每个modelIndex分配了一个复选框。

由于此checkbox-to-modelIndex assignment发生在sourceModel内部,因此A和B都获得了checkboxes

问题:如何将viewAcheckboxes隔离开来?如何使viewA无复选框?目标是确保复选框仅显示在viewB中。是否可以覆盖某些viewA属性,因此它不会显示复选框?可能我可以使用viewB代理并从代理'filterAcceptsRow()做一些调用吗?

问题显然是sourceModel不了解观点。它不关心是否为viewAB查询索引。使用代理模型时,我可以设置proxyA.setObjectName('proxyA'),然后使用其objectName做一些逻辑。但是如何从Proxy内部控制checkboxes呢?....

enter image description here

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class Model(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items = ['Item_003','Item_000','Item_005','Item_004','Item_001']
    def rowCount(self, parent=QModelIndex()):
        return len(self.items)      
    def columnCount(self, parent=QModelIndex()):
        return 1

    def data(self, index, role):
        if not index.isValid(): return QVariant()

        row=index.row()

        if role == Qt.DisplayRole:
            return QVariant(self.items[row])              

        elif role == Qt.CheckStateRole:
            return QVariant(Qt.Checked)
        else:
            return QVariant()


class Proxy(QSortFilterProxyModel):
    def __init__(self):
        super(Proxy, self).__init__()

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        layout=QHBoxLayout(self)
        self.setLayout(layout)

        tableModel=Model(self)               

        proxyA=Proxy()
        proxyA.setSourceModel(tableModel)

        proxyB=Proxy()
        proxyB.setSourceModel(tableModel)

        self.ViewA=QTableView(self)
        self.ViewA.setModel(proxyA)

        self.ViewB=QTableView(self) 
        self.ViewB.setModel(proxyB)

        layout.addWidget(self.ViewA)
        layout.addWidget(self.ViewB)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

0 个答案:

没有答案