QGridLayout 中小部件的不同对齐方式

And*_*ter 4 qt alignment qgridlayout qlayout

以下代码(Qt 5,与 Qt 4.8 的行为相同)使用 aQGridLayout在 a 的上方和左侧添加小部件QScrollArea(稍后用作一种标头):

#include <QApplication>
#include <QMainWindow>
#include <QGridLayout>
#include <QScrollArea>

class ColoredWidget : public QWidget {
public:
    ColoredWidget(const  QColor& color, QWidget* parent) : QWidget(parent) {
        QPalette pal;
        QBrush brush(color);
        brush.setStyle(Qt::SolidPattern);
        pal.setBrush(QPalette::Active, QPalette::Window, brush);
        setPalette(pal);
        setAutoFillBackground(true);
    }
};

class MainWindow : public QMainWindow {
public:
    MainWindow(QWidget* parent) : QMainWindow(parent) {
        resize(300, 400);

        QWidget* centralwidget = new ColoredWidget(QColor(0xff, 0xf0, 0xb5), this);

        QGridLayout* layout = new QGridLayout();
        centralwidget->setLayout(layout);
        setCentralWidget(centralwidget);

        // create widget with fixed height of 20 px and maximum width of 200
        QWidget* topHeader = new ColoredWidget(Qt::green, centralwidget);
        topHeader->setMaximumWidth(200);
        topHeader->setFixedHeight(20);

        // create widget with fixed width of 20 px and maximum height of 200
        QWidget* leftHeader = new ColoredWidget(Qt::blue, centralwidget);
        leftHeader->setFixedWidth(20);
        leftHeader->setMaximumHeight(200);

        // create scroll area as main widget
        QWidget* view = new QScrollArea();

        layout->addWidget(topHeader,  0, 1);
        layout->addWidget(leftHeader, 1, 0);
        // layout->addWidget(leftHeader, 1, 0, Qt::AlignTop); // widget not displayed at all!
        layout->addWidget(view, 1, 1);
    }
};


int main(int argc, char ** argv) {
    QApplication app( argc, argv );
    MainWindow win(0);
    win.show();
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

QGridLayout文档说“列和行的行为相同”,因此我希望这两个小部件的布局方式相同。

但是,左边的小部件会自动垂直居中,而顶部小部件在单元格内向左对齐(而不是水平居中)。我希望左侧小部件也位于固定位置,意味着与顶部对齐:

奇怪的布局

  • 哪个属性导致两个小部件之间存在这种不同的行为,一个居中,另一个处于固定位置
  • 我如何影响对齐(我可能可以添加一个灵活的垫片来修复它,但理想情况下我想避免这种情况)?我尝试使用Qt::AlignTop,但这使蓝色小部件消失了。

小智 5

通过以下方式设置对齐方式:

layout->setAlignment(leftHeader, Qt::AlignHCenter | Qt::AlignTop);
Run Code Online (Sandbox Code Playgroud)

或与:

layout->addWidget(leftHeader, 1, 0, Qt::AlignTop);
Run Code Online (Sandbox Code Playgroud)

很直观,而且似乎是正确的方法。如果设置完全,它也可以按预期工作。

但为什么 Widget 会消失呢?
长话短说:因为 leftHeader 的大小为 0。

在我非常相似的情况下,我setfixedHeight()和小部件再次出现,这也应该通过设置一个值来工作minimalHeight()

长话短说 - 详细信息
我将自己置于 gridLayout 的位置并尝试确定 的大小leftHeader

  1. 布局外部的leftHeader固定宽度为 20 - 可以,但没有给定高度。
    使用 QWidget 的默认值,这会导致默认高度为 0。
  2. 文档void QGridLayout::addWidget()void QGridLayout::addLayout()说明:

...
对齐方式由alignment指定。默认对齐方式为 0,这意味着小部件填充整个单元格。
...

来源

因此,对于默认对齐方式 0, 的高度leftHeader显然设置为其行的高度。
但如果Qt::Alignment使用不同的方法,如问题(Qt::AlignTop)中那样,事情就没那么简单了。

从我的角度来看,如果没有设计师的进一步设置,布局无法确定正确的高度。

快速查看 的实现void QGridLayout::addWidget(),我们可以检测到在每个添加的小部件 resp中创建了a QLayoutItem(作为 的一部分)。布局。所以看起来依赖于 Qt 的默认布局机制,该机制基于添加的小部件/布局的设置(如、、、等)。QGridBoxQGridLayoutQGridLayoutminSizemaxSizeBaseSizeSize Increment

与1.)结合使用,这意味着高度为 0 leftHeader,因此没有任何内容可以绘制。看来该小部件已经消失了。