Qt修炼手册9_Ui名字空间及setupUi()原理解读
生活随笔
收集整理的這篇文章主要介紹了
Qt修炼手册9_Ui名字空间及setupUi()原理解读
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.前言
用最新的QtCreator選擇GUI的應用會產生含有如下文件的工程:1.1 *.pro文件
QT += core gui //使用Qt的Core和Gui模塊。QT將自己的庫函數分為多個模塊,最常用的是QtCore, QtGui。如果使用 //其他的模塊的話可以添加其他模塊。常用的有QtNetwork,QtOpenGl, QtSql, QtXml. QtWebkit等等 //如果應用程序使用到該模塊,需要添加相應的模塊。 TARGET = test0831 //生成的應用程序或者鏈接庫的名字 TEMPLATE = app //工程的類型,一般有app和lib,app就是直接的應用程序,lib就是動態鏈接庫,一般用于插件開發SOURCES += main.cpp\ //就是*.cpp文件列表,多行顯示的時候用\mainwindow.cppHEADERS += mainwindow.h //*.h文件列表FORMS += mainwindow.ui //UI文件的列表,UI文件是Qt特有的界面設計文件1.2?mainwindow.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_該文件是類的聲明文件。符合主流的OOP的面向接口編程的思想。一般將類的定義都在此文件中。一般不再該文件中定義操作。注意繼承自Qt的內部文件,一定在類中加上Q_OBJECT的宏定義,Qt會使用MOC將改文件重新編譯成moc_mainwindow.cpp文件,這個才是原始的C++類的文件。所以Qt內置的類文件都不是原生態的C++類,需要Qt編譯器再處理,所以繼承子Qt的類一定要添加該宏定義,否則編譯一定不通過。 Ui::MainWindow* ui 變量聲明是mainwindow.ui生成的布局類Ui::MainWindow.1.3?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; }是類的定義文件。注意#include “ui_mainwindow.h". 工程中的mainwindow.ui文件會被UIC編譯生成ui_mainwindow.h。文件中的類就是Ui::MainWindow。MainWindow中的ui就是用布局類初始化。之后在構造函數需要使用ui->setupUI(this);就可以將Ui::MainWindow中的布局應用到本地的MainWindow。1.4?mainwindow.ui布局文件?
其中的內容是xml格式的標記文件,這點和主流的UI設計相符,現在主流的UI設計如Andriod和WP都是使用XML文件做UI設計,可以使用Qt SDK自帶的Qt Designer進行可視化設計,設計好的*.ui文件可以直接在工程文件中使用。主要.pro中FORMS中添加對應的文件名,*.cpp文件中加入#include "ui_*.h"文件名。初始化之后就可以將布局建立在自己的類中。2.一定要理解ui_mainwindow.h
這個UI的頭文件是原始項目編譯后生成的,這個里面會涉及到真正布局用的函數,也就是那個Ui域中的MainWindow??聪旅娲a: #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QButtonGroup> #include <QtGui/QHeaderView> #include <QtGui/QMainWindow> #include <QtGui/QMenuBar> #include <QtGui/QStatusBar> #include <QtGui/QToolBar> #include <QtGui/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public: QMenuBar *menuBar; QToolBar *mainToolBar; QWidget *centralWidget; QStatusBar *statusBar; void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->resize(600, 400); menuBar = new QMenuBar(MainWindow); menuBar->setObjectName(QString::fromUtf8("menuBar")); MainWindow->setMenuBar(menuBar); mainToolBar = new QToolBar(MainWindow); mainToolBar->setObjectName(QString::fromUtf8("mainToolBar")); MainWindow->addToolBar(mainToolBar); centralWidget = new QWidget(MainWindow); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); MainWindow->setCentralWidget(centralWidget); statusBar = new QStatusBar(MainWindow); statusBar->setObjectName(QString::fromUtf8("statusBar")); MainWindow->setStatusBar(statusBar); retranslateUi(MainWindow); QMetaObject::connectSlotsByName(MainWindow); } // setupUi void retranslateUi(QMainWindow *MainWindow) { MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8)); Q_UNUSED(MainWindow); } // 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產生交互!如果我們在QtDesiner中拖放一個按鈕然后點擊go to slot就很容易印證這一點。
retranslateUi則會為ui中的構件命名,具體也不在此多說。
我們需要著重討論的是,下面代碼。并思考,編譯完Designer后,產生一個布局可以理解,怎么還多了一個命名空間?namespace Ui { class MainWindow: public Ui_MainWindow {}; } // namespace Ui 前面非Ui域中的MainWindow的*ui(UI::MainWindow *ui)指向的是Ui域中的MainWindow,而Ui域中的MainWindow(上邊那行代碼)繼承Ui_MainWindow
3.到底什么是UI?
ui通常是用Qt 設計師設計出來的界面文件的后綴。通常情況下ui是一個指向這個界面類的指針?!皍i->”一般就是用來訪問這個界面類里面的控件。例如我們的ui文件里有一個叫OkButton的QPushButton。我們可以這樣來訪問這個按鈕ui->OkButton。setupUi(this)是由.ui文件生成的類的構造函數,這個函數的作用是對界面進行初始化,
它按照我們在Qt設計器里設計的樣子把窗體畫出來,把我們在Qt設計器里面定義的信號和槽建立起來。也可以說,setupUi 是我們畫界面和寫程序之間的橋梁。
總結
以上是生活随笔為你收集整理的Qt修炼手册9_Ui名字空间及setupUi()原理解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++程序设计真得不适合
- 下一篇: 用于二次开发企业即时通讯源码(C++/M