qt 小部件在添加到另一个小部件时重叠

Posted

技术标签:

【中文标题】qt 小部件在添加到另一个小部件时重叠【英文标题】:qt widgets are overlapping when added to another widget 【发布时间】:2011-07-25 16:18:38 【问题描述】:

好的,我已经做了一些调试。我编写了一个代码,在一个简单的布局管理器中将我的 QFrame 显示在另一个 QFrame 上。它不起作用。所以问题不在于代码。它只是 QFRame 无法在 QFrame 上显示的方式。有谁知道如何解决这个问题??

/**************************************************** **以前的东西(忽略)******************************************* ***************/

我有一个来自 QWidget 类的类,但我想将 5 个小部件的列表添加到该***小部件中。

当我添加它们时,它们似乎重叠,即使我将它们排列在水平布局中。

是否有一些我没有设置或遗漏的参数?

图片有 5 个小部件空间,在运行时我创建小部件并填充它们。但是当我这样做时,由于某种原因,他们在左边变得拥挤。

sensor1 = new LightWidget(green, this);
sensor2 = new LightWidget(green, this);
sensor3 = new LightWidget(green, this);
sensor4 = new LightWidget(green, this);
sensor5 = new LightWidget(green, this);

这是输出。我没有看到 5 个绿色圆圈,而是看到所有这些圆圈都在左边。

干杯, 尼克

这是 UI 表单代码...根据要求...

void setupUi(QWidget *Form)

    if (Form->objectName().isEmpty())
        Form->setObjectName(QString::fromUtf8("Form"));
    Form->resize(762, 150);
    QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(Form->sizePolicy().hasHeightForWidth());
    Form->setSizePolicy(sizePolicy);
    Form->setMinimumSize(QSize(700, 150));
    Form->setMaximumSize(QSize(16777215, 150));
    layoutWidget = new QWidget(Form);
    layoutWidget->setObjectName(QString::fromUtf8("layoutWidget"));
    layoutWidget->setGeometry(QRect(10, 20, 721, 101));
    layout = new QHBoxLayout(layoutWidget);
    layout->setObjectName(QString::fromUtf8("layout"));
    layout->setContentsMargins(0, 0, 0, 0);
    dataLayout = new QVBoxLayout();
    dataLayout->setObjectName(QString::fromUtf8("dataLayout"));
    posLayout = new QHBoxLayout();
    posLayout->setObjectName(QString::fromUtf8("posLayout"));
    posLabel = new QLabel(layoutWidget);
    posLabel->setObjectName(QString::fromUtf8("posLabel"));

    posLayout->addWidget(posLabel);

    posValue = new QLabel(layoutWidget);
    posValue->setObjectName(QString::fromUtf8("posValue"));
    posValue->setMaximumSize(QSize(16777215, 16777215));

    posLayout->addWidget(posValue);


    dataLayout->addLayout(posLayout);

    speedLayout = new QHBoxLayout();
    speedLayout->setObjectName(QString::fromUtf8("speedLayout"));
    speedLabel = new QLabel(layoutWidget);
    speedLabel->setObjectName(QString::fromUtf8("speedLabel"));

    speedLayout->addWidget(speedLabel);

    speedValue = new QLabel(layoutWidget);
    speedValue->setObjectName(QString::fromUtf8("speedValue"));

    speedLayout->addWidget(speedValue);


    dataLayout->addLayout(speedLayout);

    angleLayout = new QHBoxLayout();
    angleLayout->setObjectName(QString::fromUtf8("angleLayout"));
    angleLabel = new QLabel(layoutWidget);
    angleLabel->setObjectName(QString::fromUtf8("angleLabel"));

    angleLayout->addWidget(angleLabel);

    angleValue = new QLabel(layoutWidget);
    angleValue->setObjectName(QString::fromUtf8("angleValue"));

    angleLayout->addWidget(angleValue);


    dataLayout->addLayout(angleLayout);


    layout->addLayout(dataLayout);

    sensorLayout = new QHBoxLayout();
    sensorLayout->setObjectName(QString::fromUtf8("sensorLayout"));
    sensor1 = new LightWidget(layoutWidget);
    sensor1->setObjectName(QString::fromUtf8("sensor1"));
    sensor1->setEnabled(true);

    sensorLayout->addWidget(sensor1);

    sensor2 = new LightWidget(layoutWidget);
    sensor2->setObjectName(QString::fromUtf8("sensor2"));

    sensorLayout->addWidget(sensor2);

    sensor3 = new LightWidget(layoutWidget);
    sensor3->setObjectName(QString::fromUtf8("sensor3"));

    sensorLayout->addWidget(sensor3);

    sensor4 = new LightWidget(layoutWidget);
    sensor4->setObjectName(QString::fromUtf8("sensor4"));

    sensorLayout->addWidget(sensor4);

    sensor5 = new LightWidget(layoutWidget);
    sensor5->setObjectName(QString::fromUtf8("sensor5"));

    sensorLayout->addWidget(sensor5);


    layout->addLayout(sensorLayout);


    retranslateUi(Form);

    QMetaObject::connectSlotsByName(Form);
 // setupUi

我添加的小部件是 QFrame 类型的。

【问题讨论】:

那里没有太多的信息。代码、截图? 好的,我把代码和gui输出..谢谢! sensor[1-5] 变量在哪里以及如何声明? 它们是 ui 形式。 gui 中的 5 个框来自 ui 表单。我正在扩展 gui 表单并添加小部件。 【参考方案1】:

我认为您正在尝试在表单右侧显示的布局中添加小部件(displaypanel.ui 中右侧的红色矩形。首先通过单击 UI 设计器中的红色矩形确定布局的名称,然后看看属性检查器。我猜它叫horizo​​ntalLayout。

您可以从您的代码中访问此布局并将它们添加到类似这样的地方,假设您正在执行此操作的类中有一个 Ui::yourform 对象。

sensor1 = new LightWidget(green, this);
sensor2 = new LightWidget(green, this);
sensor3 = new LightWidget(green, this);
sensor4 = new LightWidget(green, this);
sensor5 = new LightWidget(green, this);
this->ui.horizontalLayout->addWidget(sensor1);
this->ui.horizontalLayout->addWidget(sensor2);
this->ui.horizontalLayout->addWidget(sensor3);
this->ui.horizontalLayout->addWidget(sensor4);
this->ui.horizontalLayout->addWidget(sensor5);

另一种方法是将它们作为小部件添加到您的表单中,然后将小部件提升为 LightWidget 类型:看看here。

【讨论】:

我尝试推广并这样做,但这次我什至没有看到小部件,甚至没有重叠。我认为他们在躲藏。有什么想法吗? 如果您正在使用提升,则不需要调用new LightWidget() 的代码 - 从 UI 编译器生成的代码会执行此操作。请注意,它会调用像 new LightWidget(QObject *parent) 这样的默认构造函数,而不会像您在此处那样传递绿色 - 因此您可能需要在其他地方设置颜色。 我也这样做了,只是由于某种原因它们现在没有出现在框架上。真的很奇怪。【参考方案2】:

你需要打电话

layout->addWidget(...)

对于每个子部件

layout = new QSomethingLayout(parent)

【讨论】:

但是用户界面不是已经处理了吗? sensor1, 2, ... 都是添加到 gui 的小部件。我只是在这里用 LightWidgets 初始化小部件。 如果您在您的代码中创建小部件,而不是由设计师生成的代码,应该这样做 我试过这个。我仍然得到相同的结果。我看到它们重叠:( 修改后的代码和你的代码一样,但是也贴出了ui表单代码。【参考方案3】:

只是QFRAME 不能插入QWIDGET

我将我的 QFRAME 更改为 QWIDGET,它工作正常。多谢你们!!

【讨论】:

以上是关于qt 小部件在添加到另一个小部件时重叠的主要内容,如果未能解决你的问题,请参考以下文章

具有重叠子小部件的 Qt 自定义小部件

QLayout 中的重叠小部件

Qt使用UI表单创建自定义小部件[关闭]

如何在另一个小部件更新qt中的相同内容后更新小部件内容

Qt - 在 translate() 之后获取小部件内矩形的位置

Qt将小部件添加到GraphicsView?