【问题标题】:Inheriting a MainWindow class from QMainWindow and Ui_MainWindow从 QMainWindow 和 Ui_MainWindow 继承 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 的代码之间的主要区别:

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

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

【问题讨论】:

  • 你的项目真的编译了吗?
  • 是的,两个版本都按预期工作。为什么?
  • @Rage 在 Qt 4 天里,元对象编译器 (MOC) 不喜欢 QObjects 或任何派生类的多重继承。
  • @RalphTandetzky 真的吗?为什么?
  • @Rage 可能是因为类中的内存布局。可能是因为从派生自QObjects 的两个类继承不起作用。它也不喜欢虚拟继承。我不知道为什么。但它没有用。

标签: c++ qt inheritance qmainwindow


【解决方案1】:
  1. 命名空间的一个优点是它可以防止命名冲突。所有从 QtDesigner 自动生成的名称都保留在它们自己的命名空间中。
  2. 使 Ui 类成为成员而不是使用多重继承的一个优点是 Ui 类只需要在标头中进行前向声明。在您的代码中,您有一个#include "ui_mainwindow.h",而这又会从 QtWidgets 中拖入很多包含,例如&lt;QLabel&gt;&lt;QPushButton&gt; 等。这会显着降低编译速度,因为包含mainwindow.h 的每个人现在也包含那些QtWidgets 包括。当使用 Ui 类作为成员并前向声明它时,所有这些包括只需要在编译 mainwindow.cpp 时编译,而不是在从其他地方包含 mainwindow.h 时。

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2013-02-25
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多