1.什么是ui?
ui通常是用Qt 設計師設計出來的界面文件的后綴。
通常情況下ui是一個指向這個界面類的指針。
ui-> 一般就是用來訪問這個界面類里面的控件。
例如你的ui文件里有一個叫okButton的QPushButton。
你就可以這樣來訪問這個按鈕ui->okButton。
setupUi(this)是由.ui文件生成的類的構造函數,這個函數的作用是對界面進行初始化,
它按照我們在Qt設計器里設計的樣子把窗體畫出來,把我們在Qt設計器里面定義的信號和槽建立起來。
也可以說,setupUi 是我們畫界面和寫程序之間的橋梁。
2.用QtCreator選擇GUI的應用會產生含有如下vsqt文件的工程

3.pro文件是供qmake使用的文件。
4.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;
}
介紹:
QApplication a(argc, argv)和a.exec()可以理解為載入了Qt的架構。
其中調用了個MainWindow並把它show了出來。
5.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
介紹:
開始的namespace Ui可能讓人有點摸不着頭腦,這是因為qt把ui相關的類單獨獨立了出來。
聲明namespace Ui是因為要調用Ui中的MainWindow,此MainWindow非彼MainWindow,后面涉及的*ui指針會調用它!
關於Q_OBJECT,Qt中與signal和slot相關的類都要這么聲明下。
*ui會生成個窗體。
6.mainwindow.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;
}
介紹:
構造時在堆上new了個Ui域中的MainWindow,並調用setupUi,析構僅僅是將其delete!
正如前面所述Qt很好的把ui分離了出去,前面圖中的那個.ui文件就是讓QtDesigner使的布局用文件!
7.ui_mainwindow.h
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.4.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_MainWindow
{
public:
QWidget *centralWidget;
QPushButton *pushButton;
QLabel *label;
QMenuBar *menuBar;
QToolBar *mainToolBar;
QStatusBar *statusBar;
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(400, 300);
centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
pushButton = new QPushButton(centralWidget);
pushButton->setObjectName(QStringLiteral("pushButton"));
pushButton->setGeometry(QRect(170, 180, 75, 23));
label = new QLabel(centralWidget);
label->setObjectName(QStringLiteral("label"));
label->setGeometry(QRect(50, 70, 261, 16));
MainWindow->setCentralWidget(centralWidget);
menuBar = new QMenuBar(MainWindow);
menuBar->setObjectName(QStringLiteral("menuBar"));
menuBar->setGeometry(QRect(0, 0, 400, 23));
MainWindow->setMenuBar(menuBar);
mainToolBar = new QToolBar(MainWindow);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
statusBar = new QStatusBar(MainWindow);
statusBar->setObjectName(QStringLiteral("statusBar"));
MainWindow->setStatusBar(statusBar);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0));
pushButton->setText(QApplication::translate("MainWindow", "ok ", 0));
label->setText(QApplication::translate("MainWindow", "this is a qt and vs projec to create exe.", 0));
} // retranslateUi
};
namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINWINDOW_H
介紹:
Ui_MainWindow聲明了幾個構件,它實現了setupUi函式,也就是前面那個MainWindow中調用的setupUi。
但是要說明的是QMetaObject::connectSlotsByName函式會自動連接相應名稱的信號與槽,但要注意它連接的是傳入的MainWindow及其子構件【不是子類】,注意前邊ui->setupUi(this)中傳入的this,也就是非ui域中的MainWindow,所以如果要聲明signal和slot時還是要在非ui域的MainWindow中來聲明,然后通過ui->xxx的形式來與GUI產生交互!
retranslateUi則會為ui中的構件命名。
前面非Ui域中的MainWindow的*ui指向的是Ui域中的MainWindow,而Ui域中的MainWindow繼承Ui_MainWindow。
