我最近开始使用 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
显然是一个允许用户在类定义中使用信号和槽的宏,但我现在不太担心该代码。我们将构造函数定义为
显式
,从而不允许此类类型的任何隐式转换。还显示了一个析构函数。在私有(private)访问中,我们查看
Ui
命名空间并创建一个MainWindow
指针。
类定义
我们正在使用我看到的初始化列表,但我在这里迷路了。我看到这个小部件的父级有一个默认参数 NULL(或 0),但是如果一个类继承了另一个类,为什么必须显式调用所述继承类的构造函数?即:
class A { } class B : public A { } B testObject;
这不会自动在堆栈上分配足够的内存来包含类 A 和 B 吗?为什么上面显示的 Qt 代码在其自己的构造函数中调用继承类的构造函数?
继续初始化列表的第二个参数,我必须说我对这里使用的语法感到困惑。为什么我们有一个指向
QMainWindow
的指针,我们通过调用QMainWindow
的构造函数并进一步调用new
来初始化它,从而创建一个实例本身?这种初始化方法似乎是循环的。然后我们调用 setupUi 函数并传递
this
对象进行初始化。最后,在析构函数中,我们简单地释放与
MainWindow
关联的内存。
作为最后一个问题,如果创建了一个额外的对象,比如 QPushButton
,软件会自动释放与这些对象关联的内存,还是必须将其与 delete 一起包含在析构函数中用户界面
?我还没有看到实际执行此操作的教程,因此我不确定该框架的设计是否可以为您处理。
我知道这里几乎没有直接的问题,但是我对每个陈述的逻辑是否有任何缺陷?
tl;dr,跳到类定义下的第一个和第二个项目符号。
最佳答案
请注意,你不应该在一个问题中问那么多子问题,但我会尽量回答你的问题......
Does this not automatically allocate memory on the stack sufficient memory to contain both classes A and B?
它为基类分配内存,是的。
Why does the Qt code shown above call the constructor for an inherited class within its own constructor?
因为这就是 C++ 继承的工作原理。在这种情况下,您需要显式初始化基类它可能隐含在带有默认构造函数的理想中,但您甚至没有在这里使用它,这很好。
Why do we have a pointer to a QMainWindow that we initialize by calling QMainWindow's constructor with a further call to new thereby creating an instance of itself? This initialization method seems circular.
正如您在开头所解释的那样,您有两个独立的主窗口,一个由 Qt Designer 生成,一个在您的代码中实现类,因此您提到的命名空间。
As a final question, if an additional object is created, say a QPushButton, does the software automatically deallocate the memory assocated with these objects or must that be included in the destructor alongside delete ui? I have not seen a tutorial that actually does this, so I am not sure if the framework is designed such that it is handled for you.
如果你在堆栈上分配它,那是没有必要的,因为它会在超出范围时自动销毁。如果您在堆上分配它,在 Qt 世界中,您将父级指定为构造函数的参数,以便在删除父级时自动删除它。 Qt parent-child hierarchy and mechanism 以透明方式为您完成此操作.这就是为什么您通常不会在示例中看到显式删除的原因。
关于c++ - Qt 代码问题一般可能与 C++ 有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23707053/