QCombobox 允许选择 header (Qtableview)

QCombobox enables selection of header (Qtableview)

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

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


    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'

horizontalHeader() (as much as verticalHeader()) returns a QHeaderView class,这是一个继承自QAbstractItemView的QWidget,显然不能用作字符串列表,而这正是addItems()所要求的。

如果要获取文本header的列表,可以使用table模型的headerData:

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

由于 headers 也可以重新排序,通常最好使用 header 视图:

    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))

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

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

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

    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