首页 > 解决方案 > QTableWidget 中缺少角按钮

问题描述

我正在使用 pyqt5,从我目前阅读的内容来看,应该自动创建左上角单元格。我有这个小弹出窗口,我在其中创建表并用字典中的值填充它:

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

返回真。我还尝试将其专门设置为 True。没有什么变化。此外,当我使用 QtDesigner 或创建任何其他表格时,我得到相同的结果:无法区分角按钮和列标题,或者换句话说,第一列的列标题单元格一直跨到左侧表寄宿生。任何人都可以与此相关吗?

更新 2

我仍然不清楚,为什么角按钮在我的表格中不能被视为默认按钮。但是,正如eyllanesc(谢谢!)正确指出的那样,可以使用样式表编辑角按钮。在 pyqt 中,它看起来像这样:

    self.limit_table.setCornerButtonEnabled(True)
    self.limit_table.setStyleSheet("QTableCornerButton::section{border-width: 
    1px; border-color: #BABABA; border-style:solid;}")

产生以下结果:

标签: pythonpython-3.xpyqtpyqt5qtablewidget

解决方案


您的按钮处于活动状态,但不可见。

请参阅Qt 文档

QTableView 中的角小部件被实现为 QAbstractButton,并且可以使用“QTableView QTableCornerButton::section”选择器设置样式。

警告:如果您只在 QTableCornerButton 上设置背景颜色,则背景可能不会出现,除非您将边框属性设置为某个值。这是因为,默认情况下,QTableCornerButton 绘制一个与背景颜色完全重叠的原生边框

可以使用 gridline-color 属性指定网格的颜色。

请参阅 QAbsractScrollArea 以设置可滚动背景的样式。

有关示例,请参阅自定义 QTableView。


推荐阅读