日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中ui文件的使用

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中ui文件的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Qt(73)

? ? ? 用designer設計的*.ui文件可以通過uic工具轉換為*.h文件(在編譯時也會自動生成這樣一個ui_*.h文件),有了這個.h文件就可以直接按照純C++的方式對其中的類進行調用。ui文件的使用就是利用默認工具uic自動產生一個類,然后用該類的setui函數加載界面到相應的對象上。

? ? ? .ui文件的使用有三種形式:第一種是直接使用,第二種是定義一個新類,聲明一個ui子對象,利用該對象來加載界面,第三種是將ui作為基類派生新的類。

? ? ? 借用一個例程分析如下:

? ? ? 工程及界面

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

/***************************************dialog.h********************************************/

#ifndef DIALOG_H
????????#define DIALOG_H

#include <QDialog>

namespace Ui {
????????????????class Dialog; ? ? ?

}

/*為什么要使用這樣一個命名空間呢?因為我們接著又要定義一個Dialog類,二者同名,所以才用了這個命名空間。此處的類Dialog繼承自Ui_Dialog,屬于一個前置聲明,因為在dialog.h中我們有這么一句Ui::Dialog *ui; 使用了Ui::Dialog 來定義一個指針,但是這個Ui::Dialog并沒有實際上進行定義(我們是在下文中的ui_dialog.h中定義的Dialog),也沒有包含相關頭文件,所以用了一個前置聲明(關于前置聲明此處略)*/

class Dialog : public QDialog { ? ? ? ?//又定義了一個Dialog類
????????????????Q_OBJECT
????????public:
????????????????Dialog(QWidget *parent = 0);
????????????????~Dialog();

protected:
????????????????void changeEvent(QEvent *e);

private:
????????????????
Ui::Dialog *ui; ? ? ? ?// 聲明一個子類

private slots:
????????????????void on_pushButton_clicked();
????????};

#endif // DIALOG_H

紅色部分聲明一個類,將設計出來的ui界面作為該類的一個子對象,在其構造函數中,先完成對子對象的構造,再使用子對象ui調用其setupUi(this)函數實現ui的現實。

Dialog::Dialog(QWidget *parent) :
????????????????QDialog(parent),
????????????????ui(new Ui::Dialog)
????????{
????????????????ui->setupUi(this); ? //加載界面
????????}

看完上面的代碼,我們來分析下到底為什么要這樣來使用ui文件。

在沒有qtcreator之前,給了我們一個ui文件,該如何調用?

針對于ui文件,不知道大家知不知道uic這個工具,這是qt繼承的一個工具,它可以利用ui生產.h文件。

uic ?dialog.ui ?–o ?ui_dialog.h

就生產了下面的ui_dialog.h文件:

/**************************************ui_dialog.h*******************************************/

#ifndef UI_DIALOG_H
????????#define UI_DIALOG_H

#include <QtCore/QVariant>
????????#include <QtGui/QAction>
????????#include <QtGui/QApplication>
????????#include <QtGui/QButtonGroup>
????????#include <QtGui/QDialog>
????????#include <QtGui/QHeaderView>
????????#include <QtGui/QLabel>
????????#include <QtGui/QPushButton>

QT_BEGIN_NAMESPACE

class Ui_Dialog
????????{
????????public:
????????????????QLabel *label;
????????????????QPushButton *pushButton;

????????void setupUi(QDialog *Dialog)
????????????????{
????????????????????????if (Dialog->objectName().isEmpty())
????????????????????????Dialog->setObjectName(QString::fromUtf8("Dialog"));
????????????????????????Dialog->resize(115, 148);
????????????????????????label = new QLabel(Dialog);
????????????????????????label->setObjectName(QString::fromUtf8("label"));
????????????????????????label->setGeometry(QRect(10, 30, 91, 21));
????????????????????????QFont font;
????????????????????????font.setPointSize(12);
????????????????????????font.setBold(true);
????????????????????????font.setWeight(75);
????????????????????????label->setFont(font);
????????????????????????pushButton = new QPushButton(Dialog);
????????????????????????pushButton->setObjectName(QString::fromUtf8("pushButton"));
????????????????????????pushButton->setGeometry(QRect(20, 80, 75, 23));

????????????????retranslateUi(Dialog);

????????????????QMetaObject::connectSlotsByName(Dialog);
????????????????} // setupUi

????????void retranslateUi(QDialog *Dialog)
????????????????{
????????????????????????Dialog->setWindowTitle(QApplication::translate("Dialog",????????"Dialog",????????0,????????QApplication::UnicodeUTF8));
????????????????????????label->setText(QApplication::translate("Dialog",????????"hello,wang",????????0,????????QApplication::UnicodeUTF8));
????????????????????????pushButton->setText(QApplication::translate("Dialog",????????"close",????????0,????????QApplication::UnicodeUTF8));
????????????????} // retranslateUi

};

namespace Ui {
????????????????class Dialog: public Ui_Dialog {}; ? ?
//此處定義了命名空間,其中定義了一個Dialog類,繼承自Ui_Dialog類
????????} // namespace Ui

QT_END_NAMESPACE

#endif // TT_H

通過觀察我們會發現uic自動將我們設計的ui文件,生成了一個類,在此例中為class Ui_Dialog。事實上也是這樣,uic會自動會利用設計好的ui生成一個包含類Ui_**的ui_**.h文件。那么在此例中,就會將我們設計好的dialog就會被uic文件解析,生成一個叫做ui_dialog.h的文件,此文件中包含Ui_Dialog的類。

那么總結出來,要讓ui design設計出來的界面顯示出來,只要能設法調用Ui_Dialog類的setupUi函數就行了。

一種簡單的方法,直接使用,重新寫一個這樣的main函數。

#include <QtGui/QApplication>
????????#include <QDialog>

#include "ui_dialog.h"
????????int main(int argc, char *argv[])
????????{
????????QApplication a(argc, argv);
????????Ui::Dialog ui;
????????QDialog *d=new QDialog;
????????ui. setupUi(d);
????????????????d->show();
????????????????return a.exec();
????????}

第二種方法相對比較簡單一點,就是將Ui::Dialog ui或Ui::Dialog *ui寫成一個新定義類的一個數據成員,也就是qtcreator提供的那種方法。(也叫單繼承方法,只繼承了QDialog類)

#include <QDialog>
????????#include "ui_dialog.h"

class Dialog : public QDialog {
????????????????Q_OBJECT
????????public:
????????????????Dialog(QWidget *parent = 0);
????????????????~Dialog();

protected:
????????????????void changeEvent(QEvent *e);

private:
????????????????Ui::Dialog *ui;

private slots:
????????????????void on_pushButton_clicked();
????????};

這樣使用的時候需要注意的是在初始化的時候要先完成子對象的初始化,在其構造函數中重寫構造函數。

Dialog::Dialog(QWidget *parent) :
????????????????QDialog(parent),
????????????????ui(new Ui::Dialog)
????????{
????????????????ui->setupUi(this);
????????}

第三種方法是以Ui_Dialog類為基類,派生一個新類,在該類的初始化函數中調用setupUi。(也叫多重繼承方法,繼承了QDialog類和Ui::Dialog類)

#ifndef DIALOG_H
????????#define DIALOG_H

#include <QDialog>
????????#include "ui_dialog.h"

class Dialog : public QDialog ,public Ui::Dialog
????????{
????????????????Q_OBJECT
????????public:
????????????????Dialog(QWidget *parent = 0);
????????};

實現如下:

#endif // DIALOG_H
????????#include "dialog.h"
????????#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
????????????????QDialog(parent),
????????????????Ui::Dialog() ? ? ??
????????{
????????????????setupUi(this);
????????}

附上一個直接使用ui_hellodialog.h的小例程

? ? ? ? ? ?

程序如下:

/**************************************ui_hellodialog.h******************************************/

[cpp] view plaincopy
  • /********************************************************************************?
  • **?Form?generated?from?reading?UI?file?'hellodialog.ui'?
  • **?
  • **?Created:?Wed?May?14?19:28:14?2014?
  • **??????by:?Qt?User?Interface?Compiler?version?4.8.4?
  • **?
  • **?WARNING!?All?changes?made?in?this?file?will?be?lost?when?recompiling?UI?file!?
  • ********************************************************************************/??
  • ??
  • #ifndef?UI_HELLODIALOG_H??
  • #define?UI_HELLODIALOG_H??
  • ??
  • #include?<QtCore/QVariant>??
  • #include?<QtGui/QAction>??
  • #include?<QtGui/QApplication>??
  • #include?<QtGui/QButtonGroup>??
  • #include?<QtGui/QDialog>??
  • #include?<QtGui/QHeaderView>??
  • #include?<QtGui/QLabel>??
  • ??
  • QT_BEGIN_NAMESPACE??
  • ??
  • class?Ui_HelloDialog??
  • {??
  • public:??
  • ????QLabel?*label;??
  • ??
  • ????void?setupUi(QDialog?*HelloDialog)??
  • ????{??
  • ????????if?(HelloDialog->objectName().isEmpty())??
  • ????????????HelloDialog->setObjectName(QString::fromUtf8("HelloDialog"));??
  • ????????HelloDialog->resize(400,?300);??
  • ????????label?=?new?QLabel(HelloDialog);??
  • ????????label->setObjectName(QString::fromUtf8("label"));??
  • ????????label->setGeometry(QRect(120,?120,?151,?31));??
  • ??
  • ????????retranslateUi(HelloDialog);??
  • ??
  • ????????QMetaObject::connectSlotsByName(HelloDialog);??
  • ????}?//?setupUi??
  • ??
  • ????void?retranslateUi(QDialog?*HelloDialog)??
  • ????{??
  • ????????HelloDialog->setWindowTitle(QApplication::translate("HelloDialog",?"Dialog",?0,?QApplication::UnicodeUTF8));??
  • ????????label->setText(QApplication::translate("HelloDialog",?"Hello?World!?\344\275\240\345\245\275Qt\357\274\201",?0,?QApplication::UnicodeUTF8));??
  • ????}?//?retranslateUi??
  • ??
  • };??
  • ??
  • namespace?Ui?{??
  • ????class?HelloDialog:?public?Ui_HelloDialog?{};??
  • }?//?namespace?Ui??
  • ??
  • QT_END_NAMESPACE??
  • ??
  • #endif?//?UI_HELLODIALOG_H??
  • /****************************************main.cpp****************************************/

    [cpp] view plaincopy
  • #include?"ui_hellodialog.h"??
  • int?main(int?argc,?char?*argv[])??
  • {??
  • ????QApplication?a(argc,?argv);??
  • ????QDialog?w;??
  • ????Ui::HelloDialog?ui;??
  • ????ui.setupUi(&w);??
  • ????w.show();??
  • ????return?a.exec();??
  • }??


  • 總結

    以上是生活随笔為你收集整理的Qt中ui文件的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。