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

时间:2014-03-05 15:04:55

标签: qt qt4 qt5

以下代码( Qt 5 ,与Qt 4.8相同的行为)使用QGridLayoutQScrollArea的上方和左侧添加小部件(用作稍后的标题):

#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();
}

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

然而,左边的一个是垂直居中,而顶部小部件与单元格内的左侧对齐(并且不是居中水平)。我想让左侧小部件也处于固定位置,意味着与顶部对齐:

Strange Layout

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

3 个答案:

答案 0 :(得分:2)

虽然这个问题已经很老了,但我会为所有后来来到这里的人添加我的答案,就像我一样。

使用
设置对齐方式 layout->setAlignment(leftHeader, Qt::AlignHCenter | Qt::AlignTop);
或与
layout->addWidget(leftHeader, 1, 0, Qt::AlignTop);
是直觉的,似乎是正确的方法。如果它设置完整,它也会按预期工作。

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

在我非常相似的情况下,我有 setfixedHeight() 并且小部件重新出现,例如,这也应该通过为 minimalHeight() 设置一个值来工作。

长篇故事 - 详细信息
我已经将自己置于 gridLayout 并尝试确定 leftHeader 的大小:

  1. 在布局之外 leftHeader 的固定宽度为 20 - 好的,但没有给定高度。
    使用 QWidget 的默认值,这导致默认高度为 0。
  2. void QGridLayout::addWidget()void QGridLayout::addLayout() 的文档说明:
<块引用>

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

source

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

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

快速查看 void QGridLayout::addWidget() 的实现,我们可以检测到在 QLayoutItem 内为每个添加的小部件创建了一个 QGridBox(作为 QGridLayout 的一部分)分别布局。 因此,QGridLayout 似乎依赖于 Qt 的默认布局机制,基于添加的小部件/布局的设置(如 minSizemaxSizeBaseSize、{{1 }} 等)。

1.) 结合使用,这意味着 Size Increment 的高度为 0,因此无需绘制任何内容。小部件似乎消失了。

答案 1 :(得分:1)

虽然不是最小解决方案,但您可以通过在绿色小部件的单元格中添加QHBoxLayout并在蓝色小部件的单元格中添加QVBoxLayout来修复对齐。将绿色小部件添加到QHBoxLayout,将蓝色小部件添加到QVBoxLayout。然后将addStretch(n)应用于QHBoxLayoutQVBoxLayout。也许这就是你已经提到的你可以做的事情,然后我们处于相同的知识水平。我相信这是我解决这些问题的方式,我没有花更多的时间在上面。

答案 2 :(得分:0)

试试这个:

setAlignment(Qt::AlignHCenter | Qt::AlignTop );