当将Qt小部件添加到另一个小部件中时,它们会重叠。

3

好的,我进行了一些调试。我编写了一段代码以在简单的布局管理器中在另一个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个绿色圆圈,而是所有圆圈都在左边重叠在一起。 enter image description here 谢谢, Nick
这是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类型的。

有没有更多的信息?代码、截图? - Arnold Spence
好的,我放置了代码和GUI输出.. 谢谢! - Nick
传感器[1-5]变量在哪里以及如何声明? - qid
它们在UI表单中。GUI中的5个框来自UI表单。我正在扩展GUI表单并添加小部件。 - Nick
3个回答

5
我想您正在尝试将小部件添加到表单右侧显示面板(displaypanel.ui中右侧的红色矩形)中的布局中。首先,通过在UI设计器中单击红色矩形并查看属性检查器来确定布局的名称。我猜它被称为horizontalLayout。

您可以从代码中访问此布局,并在其中添加它们,例如假设您在执行此操作的类中具有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:请看此处

我试图推广并执行此操作,但这一次我甚至看不到小部件,甚至没有重叠。我认为它们正在隐藏。有什么想法吗? - Nick
如果您正在使用Promotion,那么您应该不需要调用new LightWidget()的代码-从UI编译器生成的代码将会完成这个任务。请注意它将调用一个默认构造函数,例如new LightWidget(QObject *parent),并且不像您在此处所做的那样传入green-因此你可能需要在其他地方设置颜色。 - docsteer
我也这样做了,但由于某种原因它们现在没有出现在框架上。真的很奇怪。 - Nick

3

你需要调用

layout->addWidget(...)

对于每个子控件,其中

layout = new QSomethingLayout(parent)

但是 UI 不是已经处理了吗?sensor1、2 等都是添加到 GUI 的小部件。我只是在这里使用 LightWidgets 初始化小部件。 - Nick
如果您在代码中创建小部件,而不是由设计师生成的代码,则应执行此操作。 - Lol4t0
我尝试过了,但仍然得到相同的结果。我看到它们重叠了 :( - Nick
修改后的代码与您的代码相同,但同时发布了UI表单代码。 - Nick

1

问题在于QFRAME无法插入到QWIDGET中

我将我的QFRAME更改为QWIDGET,现在它可以正常工作了。谢谢大家!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接