zoukankan      html  css  js  c++  java
  • qt中ui的 使用介绍

    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。

  • 相关阅读:
    hdu1242 Rescue BFS广搜 + 优先队列
    hdu 1430 魔板
    康托展开
    hdu 4394 Digital Square(bfs)
    hdu 1969 Pie
    KMP模板
    hdu 1846 Brave Game
    循环赛日程表
    hdu 1022 Train Problem I
    整数划分问题
  • 原文地址:https://www.cnblogs.com/toby-zhang/p/5684221.html
Copyright © 2011-2022 走看看