Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从QMainWindow和Ui_MainWindow继承MainWindow类_C++_Qt_Inheritance_Qmainwindow - Fatal编程技术网

C++ 从QMainWindow和Ui_MainWindow继承MainWindow类

C++ 从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

我正在学习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

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
    类继承它
  • 我的问题是,使用我的方法有什么缺点,或者使用Qt创建者的方法有什么优点?请详细回答

  • 名称空间的一个优点是它可以防止命名冲突。所有从QtDesigner自动生成的名称都保留在自己的命名空间中
  • 使Ui类成为成员(而不是使用多重继承)的一个优点是,Ui类只需要在头中向前声明。在您的代码中,有一个
    #include“ui_mainwindow.h”
    ,这反过来会从QtWidgets(如
    等)中拖入大量include。这会显著降低编译速度,因为包含
    mainwindow.h
    的每个人现在都包含这些QtWidgets include。当将Ui类用作成员并转发声明它时,所有这些包含只需要在编译
    mainwindow.cpp
    时进行编译,而不需要在从其他地方包含
    mainwindow.h
    时进行编译

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