在 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 动态添加未知数量的按钮的主要内容,如果未能解决你的问题,请参考以下文章