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
我正在 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