C++ 从QMainWindow和Ui_MainWindow继承MainWindow类
我正在学习Qt,Qt 5。当我启动Qt Creator并使用所有默认设置创建项目时,我会生成这两个文件(我不包括main.cpp和.pro文件) main window.hC++ 从QMainWindow和Ui_MainWindow继承MainWindow类,c++,qt,inheritance,qmainwindow,C++,Qt,Inheritance,Qmainwindow,我正在学习Qt,Qt 5。当我启动Qt Creator并使用所有默认设置创建项目时,我会生成这两个文件(我不包括main.cpp和.pro文件) main window.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT
#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
#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
现在,我更喜欢这样做, 我的主窗口.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
#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
\ifndef主窗口
#定义主窗口
#包括
#包括“ui_main window.h”
类主窗口:公共QMainWindow、私有Ui\u主窗口
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
};
#endif//main窗口
我的主窗口.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;
}
#include "my_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);
}
MainWindow::~MainWindow()
{
}
#包括“my_mainwindow.h”
#包括
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent)
{
setupUi(本);
}
MainWindow::~MainWindow()
{
}
以下是我的代码和Qt创建者代码之间的主要区别:
命名空间Ui
。(有人能解释一下这个名称空间的用法吗?)QMainWindow
和Ui\u MainWindow
继承MainWindow
类,而Qt创建者的代码只从QMainWindow
类继承它#include“ui_mainwindow.h”
,这反过来会从QtWidgets(如
,
等)中拖入大量include。这会显著降低编译速度,因为包含mainwindow.h
的每个人现在都包含这些QtWidgets include。当将Ui类用作成员并转发声明它时,所有这些包含只需要在编译mainwindow.cpp
时进行编译,而不需要在从其他地方包含mainwindow.h
时进行编译您的项目实际编译了吗?是的,两个版本都按预期工作。为什么?@Rage在Qt的4天里,元对象编译器(MOC)不喜欢QObject或任何派生类的多重继承。@RalphTandetzky真的吗?为什么?@愤怒可能是因为课堂上的内存布局。可能是因为从
QObjects
派生的两个类继承不起作用。它也不喜欢虚拟继承。我不知道为什么。但它不起作用。