从 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 文件)
mainwindow.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
mainwindow.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
。 (谁能在这里解释一下这个命名空间的用途?)
我从QMainWindow
和Ui_MainWindow
继承MainWindow
类,而Qt Creator 的代码仅从QMainWindow
类继承它。
我的问题是,使用我的方法是否有任何缺点,或者使用 Qt Creator 的方法是否有任何优点?请给出详细答案。
【问题讨论】:
你的项目真的编译了吗? 是的,两个版本都按预期工作。为什么? @Rage 在 Qt 4 天里,元对象编译器 (MOC) 不喜欢 QObjects 或任何派生类的多重继承。 @RalphTandetzky 真的吗?为什么? @Rage 可能是因为类中的内存布局。可能是因为从派生自QObjects
的两个类继承不起作用。它也不喜欢虚拟继承。我不知道为什么。但它没有用。
【参考方案1】:
-
命名空间的一个优点是它可以防止命名冲突。所有从 QtDesigner 自动生成的名称都保留在它们自己的命名空间中。
使 Ui 类成为成员而不是使用多重继承的一个优点是 Ui 类只需要在标头中进行前向声明。在您的代码中,您有一个
#include "ui_mainwindow.h"
,而这又会从 QtWidgets 中拖入很多包含,例如<QLabel>
、<QPushButton>
等。这会显着降低编译速度,因为包含mainwindow.h
的每个人现在也包含那些QtWidgets 包括。当使用 Ui 类作为成员并前向声明它时,所有这些包括只需要在编译 mainwindow.cpp
时编译,而不是在从其他地方包含 mainwindow.h
时。
【讨论】:
以上是关于从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类的主要内容,如果未能解决你的问题,请参考以下文章
从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类
如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow
Qt - 从 QMainWindow 向 GLWidget 发送按键事件