c++ - Qt 代码问题一般可能与 C++ 有关

标签 c++ qt qtcore qmainwindow qobject

我最近开始使用 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/

相关文章:

c++ - 非唯一 C++ 未排序交集算法

c++ - 为什么 C++ 中的 getline() 不起作用? (没有匹配函数调用 'getline(std::ofstream&, std::string&)'

java - 如何为 C++ 安装 VOCE?

c++ - Qt、按钮、id 属性?任何知道点击哪个按钮的方法

c++ - 将 qnetworkaccessmanager 连接到插槽

c++ - Qt 5 将 Qt5Core.dll 放在文件夹中

c++ - FTP 服务器上的写入时间很短

c++ - 在 Qt 小部件中的视频顶部绘画

c++ - Qt 应用程序在退出时崩溃

c++ - Qt中的多级继承