【问题标题】:QGridLayout, 3 panes, not expanding properlyQGridLayout,3个窗格,未正确展开
【发布时间】:2011-12-07 05:03:11
【问题描述】:

我正在尝试使用QGridLayout 布局一个窗口(全部在代码中)。我可以将小部件添加到布局中,它们会显示在我的窗口中,但我不知道如何正确调整它们的大小。这就是我想要的

[Leftmost][--------Center---------][Rightmost]

这些是我窗口的 3 个“窗格”(所有三个都列出)。左边和右边的宽度应该是静态的,并紧贴各自的边,随着窗口的增长(或缩小),中心应该扩大以填充宽度。

一些代码:

// Create the subviews, add them to a grid layout, and set the layout to the window.
QTableView *list = new QTableView(0);
list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QTableView *flashList = new QTableView(0);
flashList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

QPushButton *infoButton = new QPushButton("Info!");
QPushButton *flashFeedsButton = new QPushButton("Flashfeeds");

QGridLayout *gridLayout = new QGridLayout;



// Set the minimum widths for all three columns of the grid
gridLayout->setColumnMinimumWidth(GridColumnFirst, 300);
gridLayout->setColumnMinimumWidth(GridColumnSecond, 300);
gridLayout->setColumnMinimumWidth(GridColumnThird, 300);

// Set the minimum heights for all rows of the grid
int headerFooterHeight = 44;
gridLayout->setRowMinimumHeight(GridRowFirst, headerFooterHeight);
gridLayout->setRowMinimumHeight(GridRowSecond, 200);
gridLayout->setRowMinimumHeight(GridRowThird, headerFooterHeight);


// Set the stretch factors
gridLayout->setColumnStretch(GridColumnFirst, 1);
gridLayout->setColumnStretch(GridColumnFirst, 2);
gridLayout->setColumnStretch(GridColumnThird, 1);

gridLayout->addWidget(list, 1, 0, Qt::AlignLeft);
gridLayout->addWidget(flashList, 1, 1, Qt::AlignCenter);
gridLayout->addWidget(infoButton, 0, 3, Qt::AlignRight);
gridLayout->addWidget(flashFeedsButton, 0, 1, Qt::AlignLeft);

_mainWindow->setLayout(gridLayout);

(您可能会说,这最终将是一个 9x9 的网格,但重点仍然存在,我正试图让我的中间行 (GridRowSecond) 拥有可伸缩的列)。

行本身扩展得很好。问题似乎是让每个单元格上的小部件展开以占用它们的包含空间。我该怎么做呢? (另外,我的列表在垂直方向上正确扩展,但不是水平方向)。

【问题讨论】:

    标签: qt qgridlayout qlayout


    【解决方案1】:

    查看QGridLayout::AddWidget 上的文档:

    默认对齐方式为 0,表示小部件填充整个单元格。

    但你有以下几点:

    gridLayout->addWidget(list, 1, 0, Qt::AlignLeft);
    gridLayout->addWidget(flashList, 1, 1, Qt::AlignCenter);
    gridLayout->addWidget(infoButton, 0, 3, Qt::AlignRight);
    gridLayout->addWidget(flashFeedsButton, 0, 1, Qt::AlignLeft);
    

    因此,您已明确告诉网格布局,您希望小部件分别与单元格的左、中、右和左对齐。在您的情况下,您可能希望使用允许小部件填充单元格并遵循各自的大小策略的默认对齐方式。

    【讨论】:

    • 当。我在阅读文档时错过了这一点。做到了。谢谢!
    【解决方案2】:

    这应该只是为您的小部件设置适当的大小策略。所以左右按钮:

    button->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
    

    对于中间按钮

    button->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
    

    第一个参数定义水平尺寸策略,第二个参数定义垂直尺寸策略。

    See the size policy documentation as well

    【讨论】:

      【解决方案3】:

      这里有很多变量(不同的小部件、小部件的不同尺寸策略以及布局本身的尺寸策略,所以很难知道哪里出了问题。一些建议:

      1) 首先尝试使用一种类型的小部件来完成您想要的。例如,具有所有扩展尺寸策略的所有 QLabel。 2)只调整小部件的大小策略,我发现在网格布局中添加东西开始让事情变得混乱。小部件尺寸策略的拉伸因子应该可以正常工作。 3) 不要害怕尝试不同的拉伸系数比率。

      我发现这是 Qt Designer (Creator) 有助于解决这些问题的原因之一。在 Designer 中调整内容和调整大小比运行编译周期要快得多。在那里解决问题后,您可以将找到的属性放入代码中,而不是编辑、编译、运行。

      【讨论】:

        猜你喜欢
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        相关资源
        最近更新 更多