在编程开发中,特别是一开始了解一个语言和一个框架的时候,如果我们解决了语言,IDE以及经典的“Hello World”程序之后,我们就需要更加深入的了解这个框架以及这个框架给我们提供的便利了,所以这里我们要开始慢慢的了解Qt的结构以及其事件的响应过程。
我们可以看到在Qt Creator中,如果我们创建一个Gui的应用程序,那么Qt Creator会给我们创建若干个文件,我们可以看到我们的主窗体是mainwindow.cpp,其中当然少不了mainwindow.h这个头文件了,我们看看这个头文件的代码。
#define MAINWINDOW_H
#include
<QtGui/QMainWindow> namespace Ui{
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void Dosomething(); private:
Ui::MainWindow *ui;
}; #endif // MAINWINDOW_H
代码很简单,我们就不详细说了,在这里,我们可以看到头文件中有一个public slots这个修饰符,我们可以留在后面再说。然后我们看看cpp文件。
//这个头文件在项目中看上去没有
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget
*parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(Dosomething()));
}
MainWindow::
~MainWindow(){
delete ui;
} void MainWindow::Dosomething()
{
const QString str ="test";
ui->textEdit->setText(str);
//this->~MainWindow();
}
cpp文件也就是我们窗体的主要代码了,这里的代码也很简单,并不复杂,唯一要说的就是头文件了,我们可以看到这里有一个头文件ui_mainwindow.h,而这个头文件在项目中并看不到(通常我们看到的是.ui文件,这个是我们在设计器里面设计生成的xml文件),而我们打开项目所在的文件夹里面,我们是可以看到有ui_mainwindow.h的,因为在编译的时候,编译器为我们重新编译了.ui文件并生成了相应的窗体代码,我们可以看一下窗体代码。
#define UI_MAINWINDOW_H
#include
<QtCore/QVariant>#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QMainWindow>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QTextEdit>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>
QT_BEGIN_NAMESPACE
class Ui_MainWindow{
public:
QAction *action;
QAction *action_2;
QWidget *centralWidget;
QPushButton *pushButton;
QTextEdit *textEdit;
QLabel *label;
QMenuBar *menuBar;
QMenu *menu;
QToolBar *mainToolBar;
QStatusBar *statusBar;
void setupUi(QMainWindow *MainWindow)
{
//初始化UI的方法
} // setupUi
void retranslateUi(QMainWindow *MainWindow)
{
//重置UI的方法
} // retranslateUi
}; namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
QT_END_NAMESPACE #endif // UI_MAINWINDOW_H
在ui文件中,控件都是以public描述存在的,而我们的主窗体,是要从这个ui的头文件中继承过来,我们可以看到我们的cpp文件中,继承了来自ui里面的类,所以我们的主要编写代码的地方,其实是一个子类,如果我们将这几个文件结构描述成一个图片的话,具体可以描述成下面这样。

从上图中我们可以看到,Qt设计器是用来生成XML的UI描述的,然后我们通过uic编译把UI文件编译成头文件。在这一部分,很像我们在C#里面编写的窗体的designer文件,这里生成的头文件负责声明控件的位置,事件的响应等等,和designer非常相似。而主窗体头文件和主窗体主要是C++开发的一贯作风,其实可以看做是一个部分,因为其实际上是从头文件中写方法的。
这样我们就能够比较清楚的了解Qt的代码结构,在后面的开发过程中,我们就可以使用其他的方式去编译Qt项目,当然IDE方式是非常不错的开发方式,但是有时候我们用命令行,能够加深我们的开发过程(例如静态编译和动态编译,如果你不用命令行永远也用不到和不知道这个地方)。
这里我就说一下Qt的代码结构,在后一篇文章我再来说说Qt是怎么响应事件的。