首页 > 解决方案 > 将 Qt 布局应用到随机放置的小部件 UI

问题描述

在我的 CentOS 7 下的 Qt 5.10.0 项目中,我有一个 UI 文件,其中包含一个设备的图片,图片上是一些随机放置在图片上的标签和按钮(这里随机是指没有行或列的形式)。我添加了一个滚动区域,然后在其中添加了所有内容。当我应用任何类型的布局以使滚动区域正常工作时,小部件会以一种疯狂的方式放错位置。

例如,在此视频中,滚动区域的布局有效,因为小部件以行方式放置,您可以添加任意数量的行。我发现了其他几个具有类似设计的教程。

由于布局是滚动区域工作所必需的,因此我有几个想法:

  1. 为这个 UI 编写一个自定义布局管理器,然后将滚动区域的布局设置为它的一个实例。
  2. 尝试重新设计 UI 并强制布局更有条理。我试过这个,但图像破坏了所有小部件的所有错误。
  3. 例如,将一些小部件分组为水平布局,然后将布局分组为垂直布局。但话又说回来,图像打破了一切。
  4. 我有另一个 UI 可以在其中滚动区域工作,但是因为小部件以行方式布局,然后分组在不需要额外步骤的组框中。

对于在这样的 UI 上实现滚动区域,您有什么建议?

PS:很抱歉没有提供任何代码示例。所有专有。

标签: qtlayout

解决方案


这将在 Widget 上创建一个滚动区域,其中包含 3 个随机放置的按钮。

void setupUi(QWidget *Widget)
{
    scrollArea = new QScrollArea(Widget);
    scrollArea->setGeometry(QRect(10, 10, 200, 200));
    scrollArea->setWidgetResizable(false); // Important! Without this, QScrollArea will try to shrink viewport widget.
    scrollAreaWidgetContents = new QWidget();
    scrollAreaWidgetContents->setGeometry(QRect(0, 0, 1000, 1000)); // Now scrollable area has size 1000x1000 px.
    pushButton = new QPushButton(scrollAreaWidgetContents);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(10, 70, 82, 23));
    pushButton_2 = new QPushButton(scrollAreaWidgetContents);
    pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
    pushButton_2->setGeometry(QRect(130, 110, 82, 23));
    pushButton_3 = new QPushButton(scrollAreaWidgetContents);
    pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));
    pushButton_3->setGeometry(QRect(70, 170, 82, 23));
    scrollArea->setWidget(scrollAreaWidgetContents);
} // setupUi

推荐阅读