这个问题很好,一个最简单的Qt项目中有4个文件,我们来看看mainwindow.h和cpp的代码:
1.mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//这句话的意思,先声明一个在Ui命名空间的名为MainWindow的未定义的的类,现在只是一个声明而已
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;//使用了刚才在Ui命名空间定义的类
};
#endif // MAINWINDOW_H
2.mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)//此处也用了一个Ui
{
ui->setupUi(this);
setAcceptDrops(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
解释:.cpp文件同时引入了两个头文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
而且它们里面都有命名空间Ui,类名也相同,但是这两者有重大区别,一个是声明,一个是定义!!!!!
1.mainwindow.cpp中引入"mainwindow.h中"中MainWindow是声明,如下:
namespace Ui {
class MainWindow;
}
2.mainwindow.cpp中引入的"ui_mainwindow.h"中MainWindow是定义,如下:
namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
两个命名空间虽然同名,而且类名也相同,但是一个是声明,一个是定义,可以有无数个声明,但是只能有一个定义,所以编译不会报错!!