【问题标题】:QCombobox enables selection of header (Qtableview)QCombobox 允许选择标题(Qtableview)
【发布时间】:2021-02-17 14:44:43
【问题描述】:

我正在 Qtableview 中预览一个文件,并希望用户选择他们想要导入数据框的列。此选择是通过在组合框中列出列标题来完成的,以便用户选择。

不知何故我无法填充列表,我的代码是:


    def Define_Combo(self):
        self.Com_X = QComboBox(self.Combo_X)               
        self.Com_X.clear()
        self.header = self.table.horizontalHeader()     
       # self.header = [self.table.horizontalHeader(self, QHeaderView)]
        self.Com_X.addItems(self.header)

我得到的错误是:

    self.Com_X.addItems(self.header)

TypeError: addItems(self, Iterable[str]): argument 1 has unexpected type 'QHeaderView'

【问题讨论】:

  • 您的代码有点混乱。首先,你为什么要创建一个新的 QTableView,据我所知,另一个 QTableView 作为父级?然后,QComboBox 的addItems 方法只接受字符串列表,而您尝试使用水平标题,这是一个 QHeaderView 实例。
  • 对不起,self.table 应该超出定义,复制粘贴错误。 *编辑,从示例中删除 '''self.table = QtWidgets.QTableView(self.tableView) '''
  • 有没有办法在组合框中添加列号或列标题以供选择?

标签: python pyqt5 qtableview qcombobox


【解决方案1】:

horizontalHeader()(和verticalHeader()一样多)返回一个QHeaderView类,这是一个继承自QAbstractItemView的QWidget,显然不能用作字符串列表,这是addItems()所需要的。

如果要获取文本标题列表,可以使用表格模型的headerData

    model = self.tableView.model()
    for column in range(model.columnCount()):
        self.Com_X.addItem(model.headerData(column, QtCore.Qt.Horizontal))

由于标题也可以重新排序,因此通常最好使用标题视图:

    model = self.tableView.model()
    header = self.tableView.horizontalHeader()
    for column in range(model.columnCount()):
        visualIndex = header.visualIndex(column)
        self.Com_X.addItem(model.headerData(visualIndex, QtCore.Qt.Horizontal))

大写名称只能用于类和常量,不能用于变量和属性,因此最好将组合命名为self.com_X。在官方Style Guide for Python Code

上阅读有关此重要主题的更多信息

【讨论】:

  • 感谢您的帮助。但是,我不断收到错误 ``` self.com_x.addItem(model.headerData(column, QtCore.Qt.Horizo​​ntal)) TypeError: headerData() missing 1 required positional argument: 'role'``` 你的脚本示例,我想了解为什么您的示例对我不起作用,因为它看起来更优雅。再次感谢
  • 嗯,奇怪,它应该在没有角色的情况下工作,但是某些模型类确实不使用默认值。无论如何,只需添加QtCore.Qt.DisplayRole 作为headerData() 的两个调用的最后一个参数(就在水平之后)。
【解决方案2】:

这可能不是最优雅的解决方案,但我的代码现在如下所示:

    def Define_Combo(self):

        self.com_x.clear()
        self.com_y.clear()
        self.com_z.clear()
        model = self.table.model()
        combo_list = []
        for column in range(model.columnCount()):
            combo_list.append(model.index(0, column, self.table.rootIndex()).data()) # for row 0
        self.com_x.addItems(combo_list)
        self.com_y.addItems(combo_list)
        self.com_z.addItems(combo_list)

我犯的另一个错误是在定义中定义了我的 QcomboBox

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多