QT - QGridLayout 需要 Header 行的不同间距

QT - QGridLayout Different Spacing of Header Row needed

我有一个 QGridLayout,我需要所有行的间距,但第一行不需要。我怎样才能做到这一点?在下图中,您可以看到单元格之间的 space。我可以设置间距:

self.grid.setSpacing(0)

但这会影响整个网格。

Qt 中没有魔法可以实现这一点。您需要单独创建自己的 header,您可以通过在 QWidget 中创建水平布局来实现。在 gridlayout 所在的小部件 resizeEvent 中,您需要根据 gridlayout 每一列中小部件的宽度显式更改 header 布局中小部件的宽度。

如果您不想这样做,请考虑使用 QTableWidget,它包含一个 built-in header

一种选择是 QGridLayout 中的项目之间没有间距(使用 setSpacing(0))。这实现了 header 之间没有间距的目标。

要在后续行中实现项目之间的间距,您可以在每个项目周围引入另一种布局,两边都有间隔符或空小部件。


或者,您可以在当前项目之间的网格布局中插入列(同时仍设置 setSpacing(0))。这些列的 header 行中的项目可以设置样式,使其看起来就像是您当前拥有的 header 项目的一部分。

这可以通过删除水平间距并在 header 标签上使用 columnSpan 来轻松完成。

这是一个简单的演示脚本:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QtGui.QGridLayout(self)
        layout.setHorizontalSpacing(0)
        self.setStyleSheet('background: black; color: white')
        headers = 'Name: Item: Color: Status:'.split()
        for column, header in enumerate(headers):
            label = QtGui.QLabel(header)
            label.setStyleSheet('background: silver; padding: 5px')
            if column < len(headers) - 1:
                layout.addWidget(label, 0, 2 * column, 1, 2)
                layout.setColumnMinimumWidth(2 * column + 1, 10)
            else:
                layout.addWidget(label, 0, 2 * column)
            widget = QtGui.QWidget()
            widget.setStyleSheet('border: 1px solid white')
            layout.addWidget(widget, 1, 2 * column)
        layout.setRowStretch(1, 1)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 450, 90)
    window.show()
    sys.exit(app.exec_())

结果: