QT按钮创建对象

QT push button to create object

我正在尝试使用桩结构创建一个小游戏,我正在使用 QT Widget 应用程序,我的问题是:我有一个 class 桩需要用 Pile p1(size) 初始化,当按下“创建”按钮时获得“大小”。问题是:当我这样做时,我的对象 p1 将专用于 PushButton 函数,因此我程序的其他函数无法访问 p1,因为它会在 PushButton 函数结束后立即消失,我需要与其他函数一起访问 p1来自我的 mainwindow.cpp.

的功能

如何解决这个问题?我需要以不同方式初始化 p1 吗?

许多可能的解决方案之一。假设 class Pile 不是 QObject 并且您需要创建此 class 的多个实例,我们需要这样的容器来存储那些 Pile。有标准的容器,也有Qt自己的容器模板QList,是list、vector和queue.

的混合体

确保在 mainwindow.h header:

中使用 QList
#include <QList>

MainWindowclass声明成员变量:

 QList<Pile>  piles;

在处理点击信号的函数中:

void MainWindow::buttonClick() {

     Pile p(size);
     // do some stuff with p
     piles.append(p);  // or  just piles.append(Pile(size)); 
                       // instead of creating separate copy Pile p(size);
}

就是这样。 MainWindow 的析构函数会销毁创建的 objects,您可以从其他成员函数访问它们。

这种简单方法的缺点是什么? QListPile class 按值复制到其动态存储中。您的 Pile class 必须可以正确复制或至少是微不足道的。 QList 隐藏了它对 object 和存储所做的很多事情,如果 object 足够大,可能不会连续存储。

如果 Pile 是 Qt,则情况略有不同 class。

QList's value type must be an assignable data type. This covers most data types that are commonly used, but the compiler won't let you, for example, store a QWidget as a value; instead, store a QWidget *.

如果您想将它与 QList 一起使用,则必须使用指向 QObject 的指针。 object 必须正确分配和释放,尽管 Qt 提供了当 parent object 停止存在时自动释放的机制。