从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类

Posted

技术标签:

【中文标题】从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类【英文标题】:Inheriting a MainWindow class from QMainWindow and Ui_MainWindow 【发布时间】:2013-06-21 13:57:14 【问题描述】:

我正在学习 Qt,Qt 5。当我启动 Qt Creator 并使用所有默认设置创建一个项目时,我会生成这两个文件,(我不包括 main.cpp 和 .pro 文件)

ma​​inwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
;

#endif // MAINWINDOW_H

ma​​inwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);


MainWindow::~MainWindow()

    delete ui;


现在,我更喜欢这样做,

my_mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ui_mainwindow.h"


class MainWindow : public QMainWindow, private Ui_MainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
;

#endif // MAINWINDOW_H

my_mainwindow.cpp

#include "my_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :   QMainWindow(parent)

    setupUi(this);


MainWindow::~MainWindow()




以下是我的代码和 Qt Creator 的代码之间的主要区别:

    我的代码中没有namespace Ui。 (谁能在这里解释一下这个命名空间的用途?) 我从QMainWindowUi_MainWindow 继承MainWindow 类,而Qt Creator 的代码仅从QMainWindow 类继承它。

我的问题是,使用我的方法是否有任何缺点,或者使用 Qt Creator 的方法是否有任何优点?请给出详细答案。

【问题讨论】:

你的项目真的编译了吗? 是的,两个版本都按预期工作。为什么? @Rage 在 Qt 4 天里,元对象编译器 (MOC) 不喜欢 QObjects 或任何派生类的多重继承。 @RalphTandetzky 真的吗?为什么? @Rage 可能是因为类中的内存布局。可能是因为从派生自QObjects 的两个类继承不起作用。它也不喜欢虚拟继承。我不知道为什么。但它没有用。 【参考方案1】:
    命名空间的一个优点是它可以防止命名冲突。所有从 QtDesigner 自动生成的名称都保留在它们自己的命名空间中。 使 Ui 类成为成员而不是使用多重继承的一个优点是 Ui 类只需要在标头中进行前向声明。在您的代码中,您有一个#include "ui_mainwindow.h",而这又会从 QtWidgets 中拖入很多包含,例如&lt;QLabel&gt;&lt;QPushButton&gt; 等。这会显着降低编译速度,因为包含mainwindow.h 的每个人现在也包含那些QtWidgets 包括。当使用 Ui 类作为成员并前向声明它时,所有这些包括只需要在编译 mainwindow.cpp 时编译,而不是在从其他地方包含 mainwindow.h 时。

【讨论】:

以上是关于从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类的主要内容,如果未能解决你的问题,请参考以下文章

从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类

如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

如何从另一个类调用 QMainWindow 组件?

Qt - 从 QMainWindow 向 GLWidget 发送按键事件

如何从QDialog刷新/更新/重绘QMainWindow?

QMainWindow 从 main() 函数打开,但不能从任何其他函数打开