【问题标题】:Unable to select Checkbox inside TreeView无法选择 TreeView 中的复选框
【发布时间】:2012-02-18 00:54:58
【问题描述】:

我尝试创建带有复选框的树视图,但无法选中复选框。

关于标志方法,我曾将其称为 ItemisuserCheckable,但仍无法使其正常工作...

我是否在这里遗漏了一些东西来启用复选框的选择。

一个sn-p的代码是:

import sys

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

class StbTreeView(QAbstractListModel):
    def __init__(self, args, parent=None):
        super(StbTreeView, self).__init__(parent)

        self.args = args
        print self.args

    def rowCount(self, parent):
        return len(self.args)

    def headerData(self, section, orientation, role):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return QString("Select STB's")

    def flags(self, index):
        row = index.row()
        if row:
            return  Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable

    def data(self, index, role=Qt.DisplayRole):

        if role == Qt.DisplayRole:
            row = index.row()
            return self.args[row]

        if role == Qt.CheckStateRole:

            row = index.row()
            return QVariant(Qt.Unchecked)

    def setData(self, index, value, role):

        if role == Qt.CheckStateRole:
            if value == Qt.Checked:
                row = index.row()
                selected_stb = self.args[row]
                print 'selected_stb is %s' % selected_stb
                print 'Value is %s' % value
                self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index, index)
                return True
            #return QVariant(Qt.Checked)

def main():
    myapp = QApplication(sys.argv)

    data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8']

    model = StbTreeView(data)
    tree_view = QTreeView()
    tree_view.show()
    tree_view.setModel(model)

    myapp.exec_()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python qt treeview pyqt pyqt4


    【解决方案1】:

    您需要在某处保存当前项目状态(选中\未选中)并在调用 setdata() 方法后更改它。您的项目始终未选中,因为您始终在 data() 方法中为它们返回 QVariant(Qt.Unchecked)

    我对你的代码做了一些修改,看看它是否适合你:

    import sys
    
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    
    class TestItem():
        def __init__(self, name, checked):
            self.checked = checked
            self.name = name
    
    class StbTreeView(QAbstractListModel):
        def __init__(self, args, parent=None):
            super(StbTreeView, self).__init__(parent)
    
            self.args = []
            for item_name in args:
                self.args.append(TestItem(item_name, False))
    
            for item in self.args:
                print item.name
    
        def rowCount(self, parent):
            return len(self.args)
    
        def headerData(self, section, orientation, role):
            if role == Qt.DisplayRole:
                if orientation == Qt.Horizontal:
                    return QString("Select STB's")
    
        def flags(self, index):
            return  Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
    
        def data(self, index, role=Qt.DisplayRole):
            if role == Qt.DisplayRole:
                row = index.row()
                print self.args[row].name
                return self.args[row].name
    
            if role == Qt.CheckStateRole:
                row = index.row()
                print self.args[row].checked
                if self.args[row].checked == False:
                    return QVariant(Qt.Unchecked)
                else:
                    return QVariant(Qt.Checked)
    
        def setData(self, index, value, role):
            if role == Qt.CheckStateRole:
                row = index.row()
                self.args[row].checked = not self.args[row].checked             
            return True
    
    def main():
        myapp = QApplication(sys.argv)
    
        data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8']
    
        model = StbTreeView(data)
        tree_view = QTreeView()
        tree_view.show()
        tree_view.setModel(model)
    
        myapp.exec_()
    
    if __name__ == '__main__':
        main()
    

    希望这会有所帮助,问候

    【讨论】:

    • Thnaks 它对我来说非常有效......但我想使用下面提到的代码在组合框中拉出这个树视图......但我也无法让它工作......只是想知道我是否在这里做错了什么。
    【解决方案2】:

    谢谢它真的对我有用。我最初的要求是在组合框中调用此视图/模型。我尝试调用它,但它不起作用......我能够看到组合框中的视图,但无法选择任何复选框。我尝试了很多可能性,但没有成功..

    对您的代码稍作修改以从组合框调用。

    修改后的代码为:

    import sys
    
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    
    class TestItem():
        def __init__(self, name, checked):
            self.checked = checked
            self.name = name
    
    class StbTreeView(QAbstractListModel):
        def __init__(self, args, parent = None):
            super(StbTreeView, self).__init__(parent)
    
            self.args = []
            for item_name in args:
                self.args.append(TestItem(item_name, False))
    
            for item in self.args:
                print item.name
    
        #print 'Value of self.args is %s' % self.args
    
        def rowCount(self, parent):
            return len(self.args)
    
        def headerData(self, section, orientation, role):
            if role == Qt.DisplayRole:
                if orientation == Qt.Horizontal:
                    return QString("Select STB's")
    
        def flags(self, index):
            return  Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
    
        def data(self, index, role=Qt.DisplayRole):
            if role == Qt.DisplayRole:
                row = index.row()
                print self.args[row].name
                return self.args[row].name
    
            if role == Qt.CheckStateRole:
                row = index.row()
                print self.args[row].checked
                if self.args[row].checked == False:
                    return QVariant(Qt.Unchecked)
                else:
                    return QVariant(Qt.Checked)
    
        def setData(self, index, value, role):
            if role == Qt.CheckStateRole:
                row = index.row()
                self.args[row].checked = not self.args[row].checked             
            return True
    
    class Template(QTreeView):
        def __init__(self, parent=None):
            super(Template, self).__init__(parent)
    
            self.data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8']
            self.MainUI()
    
        def MainUI(self):
            self.model = StbTreeView(self.data)
            self.setModel(self.model)
    
    
    def main():
        myapp = QApplication(sys.argv)
        temp = Template()
        temp.show()
        myapp.exec_()
    
    if __name__ == '__main__':
        main()
    

    组合框中的代码:

    stb_listview = QComboBox()
    view = Template()
    stb_listview.setView(view)
    stb_listview.setModel(view.model)
    

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多