【发布时间】:2014-05-17 02:39:17
【问题描述】:
我最近开始使用 Qt 框架,并意识到我可能不太了解 C++ 的语法。以在 Qt 中启动 Widget 项目时作为基础给出的这段代码为例。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
其中MainWindow 类定义为:
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
类声明
通过这个,我可以看到创建了一个新的命名空间
Ui。我认为这是一种避免与其他用户实现的类发生命名冲突的实现工作。下面是一个新的类定义;它继承了
QMainWindow,所以我们实际上是在创建一个自定义窗口对象。Q_OBJECT显然是一个允许用户在类定义中使用信号和槽的宏,但我现在并不太担心该代码。我们将构造函数定义为
explicit,从而禁止此类类型的任何隐式转换。还显示了一个析构函数。在私有访问中,我们查看
Ui命名空间并创建一个MainWindow指针。
类定义
-
我们正在使用我看到的初始化列表,但我在这里迷路了。我看到这个小部件的父级有一个默认参数 NULL (或 0 ),但是如果一个类固有另一个类,为什么必须显式调用所述继承类的构造函数?那就是:
class A { } class B : public A { } B testObject;
这不会自动在堆栈上分配足够的内存来包含 A 类和 B 类吗?为什么上面显示的 Qt 代码在其自己的构造函数中调用继承类的构造函数?
继续初始化列表的第二个参数,我必须说我对这里使用的语法感到困惑。为什么我们有一个指向
QMainWindow的指针,我们通过调用QMainWindow的构造函数并进一步调用new来初始化它,从而创建它自己的一个实例?这种初始化方法似乎是循环的。然后我们调用 setupUi 函数并传递
this对象进行初始化。最后,在析构函数中,我们简单地释放与
MainWindow关联的内存。
最后一个问题,如果创建了一个额外的对象,比如QPushButton,软件会自动释放与这些对象相关联的内存,还是必须将其与delete ui 一起包含在析构函数中?我还没有看到实际执行此操作的教程,因此我不确定该框架是否设计为可以为您处理。
我知道这里很少有直接的问题,但我对每个陈述的逻辑是否有任何缺陷?
tl;dr,跳到类定义下的第一个和第二个项目符号。
【问题讨论】:
-
我的印象是在编译时会添加一个默认构造函数来初始化基础。 QMainWindow 继承的类呢?我知道类可能只调用其上一层的构造函数,但除非
QMainWindow的继承类有一些“包罗万象”的构造函数,否则我们会遇到一些麻烦。另外,谢谢你的收获!
标签: c++ qt qtcore qmainwindow qobject