QTableWidget 中缺少角按钮
Missing corner button in QTableWidget
我正在使用 pyqt5,根据我目前阅读的内容,top-left 角单元格应该会自动创建。我有这个小弹出窗口 window,我在其中创建 table 并用字典中的值填充它:
class LimitTable(QWidget):
query = QtCore.pyqtSignal(dict)
def __init__(self, dic):
QWidget.__init__(self)
self.dic = dic
self.setup_ui()
self.setWindowTitle("Limit Table")
def setup_ui(self):
self.limit_table = QtWidgets.QTableWidget(self)
self.limit_table.setGeometry(QtCore.QRect(10, 40, 681, 81))
self.limit_table.setObjectName("limit_table")
row_names = ["Lower Limit", "Upper Limit"]
col_names = list(self.dic.keys())
self.limit_table.setRowCount(len(row_names))
self.limit_table.setColumnCount(len(self.dic.keys()))
self.limit_table.setHorizontalHeaderLabels(col_names)
helpers.add_header(self.limit_table, len(row_names),
row_names, "vertical")
helpers.add_header(self.limit_table, len(col_names), col_names)
for i, val in enumerate(self.dic.values()):
self.limit_table.setItem(0, i,
QTableWidgetItem("{:0.1e}".format(val[0])))
self.limit_table.setItem(1, i,
QTableWidgetItem("{:0.1e}".format(val[1])))
其中 add_header 只是
def add_header(tab_obj, count, name, hv="horizontal"):
"""Adds header objects to TableWidget.
Args:
- tab_obj (QTableWidget) : table object
- count (int) : number of cells
- name (str) : header name
- hv (str) : choose horizontal or vertical header
"""
tab_obj.setColumnCount(count)
for col in range(0, count):
item = QtWidgets.QTableWidgetItem()
if isinstance(name, dict):
item.setText(list(name.keys())[col])
if isinstance(name, list):
item.setText(name[col])
if hv == "horizontal":
tab_obj.setHorizontalHeaderItem(col, item)
adjust_header(tab_obj, count, "Stretch")
if hv == "vertical":
tab_obj.setVerticalHeaderItem(col, item)
return True
所以原则上它是非常基础的并且根据教科书。 "setRowCount" 和 "setColumnCount" 行应该做我想做的。但是我得到了这个
更新 1
显然,角落按钮在那里...
self.limit_table.isCornerButtonEnabled()
returns 没错。我还专门尝试将其设置为 True。没有什么改变。此外,当我使用 QtDesigner 或创建任何其他 table 时,我得到相同的结果:无法区分角按钮与列 header 或换句话说,列 header第一列的单元格一直向左 table 边界延伸。任何人都可以与此相关吗?
更新 2
我仍然不清楚,为什么在我的 table 中不能将角按钮视为默认按钮。但是,正如 eyllanesc(感谢大佬!)正确指出的那样,可以使用 sheet 样式编辑角按钮。在 pyqt 中它看起来像这样:
self.limit_table.setCornerButtonEnabled(True)
self.limit_table.setStyleSheet("QTableCornerButton::section{border-width:
1px; border-color: #BABABA; border-style:solid;}")
产生以下结果:
您的按钮处于活动状态,但不可见。
QTableView 中的角部件作为 QAbstractButton 实现,可以使用“QTableView QTableCornerButton::section”选择器设置样式。
警告:如果您只在 QTableCornerButton 上设置了背景颜色,除非您将边框 属性 设置为某个值,否则背景可能不会出现。这是因为,默认情况下,QTableCornerButton 绘制了一个与背景颜色完全重叠的原生边框。
可以使用gridline-color指定网格的颜色属性。
请参阅 QAbsractScrollArea 以设置可滚动背景的样式。
有关示例,请参阅自定义 QTableView。
我正在使用 pyqt5,根据我目前阅读的内容,top-left 角单元格应该会自动创建。我有这个小弹出窗口 window,我在其中创建 table 并用字典中的值填充它:
class LimitTable(QWidget):
query = QtCore.pyqtSignal(dict)
def __init__(self, dic):
QWidget.__init__(self)
self.dic = dic
self.setup_ui()
self.setWindowTitle("Limit Table")
def setup_ui(self):
self.limit_table = QtWidgets.QTableWidget(self)
self.limit_table.setGeometry(QtCore.QRect(10, 40, 681, 81))
self.limit_table.setObjectName("limit_table")
row_names = ["Lower Limit", "Upper Limit"]
col_names = list(self.dic.keys())
self.limit_table.setRowCount(len(row_names))
self.limit_table.setColumnCount(len(self.dic.keys()))
self.limit_table.setHorizontalHeaderLabels(col_names)
helpers.add_header(self.limit_table, len(row_names),
row_names, "vertical")
helpers.add_header(self.limit_table, len(col_names), col_names)
for i, val in enumerate(self.dic.values()):
self.limit_table.setItem(0, i,
QTableWidgetItem("{:0.1e}".format(val[0])))
self.limit_table.setItem(1, i,
QTableWidgetItem("{:0.1e}".format(val[1])))
其中 add_header 只是
def add_header(tab_obj, count, name, hv="horizontal"):
"""Adds header objects to TableWidget.
Args:
- tab_obj (QTableWidget) : table object
- count (int) : number of cells
- name (str) : header name
- hv (str) : choose horizontal or vertical header
"""
tab_obj.setColumnCount(count)
for col in range(0, count):
item = QtWidgets.QTableWidgetItem()
if isinstance(name, dict):
item.setText(list(name.keys())[col])
if isinstance(name, list):
item.setText(name[col])
if hv == "horizontal":
tab_obj.setHorizontalHeaderItem(col, item)
adjust_header(tab_obj, count, "Stretch")
if hv == "vertical":
tab_obj.setVerticalHeaderItem(col, item)
return True
所以原则上它是非常基础的并且根据教科书。 "setRowCount" 和 "setColumnCount" 行应该做我想做的。但是我得到了这个
更新 1
显然,角落按钮在那里...
self.limit_table.isCornerButtonEnabled()
returns 没错。我还专门尝试将其设置为 True。没有什么改变。此外,当我使用 QtDesigner 或创建任何其他 table 时,我得到相同的结果:无法区分角按钮与列 header 或换句话说,列 header第一列的单元格一直向左 table 边界延伸。任何人都可以与此相关吗?
更新 2
我仍然不清楚,为什么在我的 table 中不能将角按钮视为默认按钮。但是,正如 eyllanesc(感谢大佬!)正确指出的那样,可以使用 sheet 样式编辑角按钮。在 pyqt 中它看起来像这样:
self.limit_table.setCornerButtonEnabled(True)
self.limit_table.setStyleSheet("QTableCornerButton::section{border-width:
1px; border-color: #BABABA; border-style:solid;}")
产生以下结果:
您的按钮处于活动状态,但不可见。
QTableView 中的角部件作为 QAbstractButton 实现,可以使用“QTableView QTableCornerButton::section”选择器设置样式。
警告:如果您只在 QTableCornerButton 上设置了背景颜色,除非您将边框 属性 设置为某个值,否则背景可能不会出现。这是因为,默认情况下,QTableCornerButton 绘制了一个与背景颜色完全重叠的原生边框。
可以使用gridline-color指定网格的颜色属性。
请参阅 QAbsractScrollArea 以设置可滚动背景的样式。
有关示例,请参阅自定义 QTableView。