在 C++ 中的 Qt 中向 UI 动态添加未知数量的按钮

Posted

技术标签:

【中文标题】在 C++ 中的 Qt 中向 UI 动态添加未知数量的按钮【英文标题】:Dynamically add an unknown number of button to UI in Qt in C++ 【发布时间】:2013-09-19 15:37:45 【问题描述】:

我正在尝试在网格布局中插入 QPushButton,这很容易,但我不会提前知道数字。

这是我所拥有的:

testapp.cpp

#include "testapp.h"

testApp::testApp(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)

    ui.setupUi(this);
    for (int i = 0; i < 4; i++)
    
        for (int j = 0; j < 4; j++)
        
            QPushButton* panelButton = new QPushButton();
            panelButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
            ui.PanelButtonGridLayout->addWidget(panelButton,i,j);
        
    


testApp::~testApp()



main.cpp

#include <QtGui/QApplication>

#include "testapp.h"

int main(int argc, char *argv[])

    QApplication app(argc, argv);
    testApp w;
    w.show();
    return app.exec();

所以我知道这行不通,因为对象将在当前循环结束时被删除。

我考虑过在 main 中创建 QPushButton 的 QList(例如)并将其传递给 testapp 类,但我不确定这是一个好的解决方案。可能有更好的方法。

编辑: 由于某些原因,它没有编译。现在是。我讨厌它到来的时候。

【问题讨论】:

“所以我知道这行不通,因为对象将在当前循环结束时被删除”。嗯,什么物体? 【参考方案1】:

实际上,不,对象不会在循环结束时被删除,因为您将其分配在堆上,而不是在堆栈上:

 QPushButton* panelButton = new QPushButton();

在这种情况下,按钮将在其父级 (ui.PanelButtonGridLayout) 被销毁时自动销毁。

由于下面的 cmets 状态,对象的父对象将在内部由addWidget 方法设置。

来自documentation:

注意:项目的所有权转移到布局,布局负责删除它。

【讨论】:

addWidget 应该解决这个问题(顺便说一句,我不是反对者......) 不,这里不需要。 addWidget 调用转移所有权。

以上是关于在 C++ 中的 Qt 中向 UI 动态添加未知数量的按钮的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 中向 Info.plist 添加条目

qt 怎么根据ui文件动态创建QWIdget窗口部件?

如何在 C++ 中向向量中添加新对象

PyQt5:pyuic5 - 未知的 Qt 小部件:QKeySequenceEdit

在 Qt 创建器中向表视图添加仅可读行

在 Swift 中向 UILabel 动态添加行