欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Qt 初始項(xiàng)目代碼

 更新時(shí)間:2025年02月28日 10:32:47   作者:Yui_  
本文解析了Qt項(xiàng)目創(chuàng)建后的主要文件,包括main.cpp、mywidget.h、mywidget.cpp、mywidget.ui和.pro,main.cpp這五個(gè)文件,具有一定的參考價(jià)值,感興趣的可以了解一下

當(dāng)創(chuàng)建完項(xiàng)目時(shí)看到這樣的界面:

image.png

本文將聚焦與項(xiàng)目創(chuàng)建后的這5個(gè)文件的解析,這5個(gè)文件分別為: test250225mywidget.hmain.cppmywidget.cppmywidget.ui。
現(xiàn)在開始逐個(gè)解析

1. main.cpp內(nèi)容解析

#include "mywidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();
    return a.exec();
}

該函數(shù)中的QApplication a這是編寫Qt圖形化界面一定需要的對象,它的作用為:

  • 應(yīng)用程序的初始化
  • 事件循環(huán)管理
  • 窗口管理
  • GUI相關(guān)功能
  • 全局資源管理
    在 Qt Widgets 應(yīng)用程序中,通常必須創(chuàng)建 QApplication 對象,否則 GUI 組件無法正常工作。

繼續(xù)往下看,MyWidget是創(chuàng)建項(xiàng)目時(shí),填寫的類名。
w.show()的作用是創(chuàng)建一個(gè)控件對象,并顯示出來,同時(shí)你還可以用.hide()讓控件隱藏,注意Wight的父類是QWight,Wight中的方法大部分都是繼承至父類。

然后我們來看a.exec()這個(gè)有沒有很熟悉,如果你學(xué)過Linux,在Linux中有一個(gè)進(jìn)程程序替換的函數(shù),確切來說是6個(gè)函數(shù),他們是一個(gè)系列,可以把可執(zhí)行文件中的代碼和數(shù)據(jù)替換到當(dāng)前進(jìn)程中。
是不是覺得他們有什么關(guān)系呢?
完全沒有如何關(guān)系?。?!
只是名字一樣而已,就像家豪這個(gè)名字,可能你遇到過幾個(gè)家豪,只是名字一樣而已。
在計(jì)算機(jī)的世界,這種情況并不少見,你還能想到其他例子嗎?
你肯定想到了計(jì)算機(jī)中的棧和堆了吧,有數(shù)據(jù)結(jié)構(gòu)中的棧和堆,還有操作系統(tǒng)中的棧和堆甚至還有JVM中的棧和堆,這3種棧和堆都有不同的概念,但是他們的名字相同。
主函數(shù)介紹完了,我們開始介紹其他文件。

2. mywidget.h內(nèi)容解析

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

class MyWidget : public QWidget//繼承父類
{
    Q_OBJECT//宏替換

public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();

private:
    Ui::MyWidget *ui;
};
#endif // MYWIDGET_H

先看這段代碼:

QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

其中QT_BEGIN_NAMESPACE和QT_END_NAMESPACE是Qt提供的命名空間宏。
namespace Ui { class MyWidget; }是一種向前聲明,用于聲明UI::MyWidget這個(gè)類。

在這里我們主要還是關(guān)注這個(gè)類,這個(gè)類就是我們創(chuàng)建項(xiàng)目時(shí)所命名的,可以看到它確實(shí)繼承至QWight我們可以看到類中存在著一個(gè)宏,Q_OBJECT是Qt中一個(gè)內(nèi)置的宏,宏本質(zhì)上就是文本替換,其實(shí)它會(huì)替換為一大堆代碼。
跳轉(zhuǎn)過去看看:

image.png

看不懂。。。
Qt中有一個(gè)非常核心的機(jī)制,“信號(hào)和槽”,如果某個(gè)類想要使用"信號(hào)和槽"就需要引入這個(gè)宏。
在往下看,就是構(gòu)造函數(shù)和析構(gòu)函數(shù),析構(gòu)函數(shù)沒什么好講的,我們看到構(gòu)造函數(shù),構(gòu)造函數(shù)的形參是一個(gè)QWidget類型的缺省。
這里其實(shí)存在著一個(gè)Qt中引入的對象樹機(jī)制(目前不解釋)。
創(chuàng)建的Qt對象可把這個(gè)對象給掛到對象樹上,往樹上掛的時(shí)候就需要指定父節(jié)點(diǎn)(這里的樹是n叉樹)

3. mywidget.cpp內(nèi)容解析

#include "mywidget.h"http://創(chuàng)建項(xiàng)目生成的頭文件
#include "ui_mywidget.h"http://form file被qmake生成的頭文件

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);//把form file生成的界面和當(dāng)前widget關(guān)聯(lián)起來
}

MyWidget::~MyWidget()
{
    delete ui;
}

image.png

4. form file內(nèi)容解析

雙擊文件mywidget.ui文件

image.png

會(huì)進(jìn)入設(shè)計(jì)界面

image.png

左邊是Qt內(nèi)置的1控件,可以直接拖拽到右邊的程序窗口,沒錯(cuò)我們還可以這樣創(chuàng)建出具體的界面。每個(gè)控件都有很多屬性,我們可以自行設(shè)計(jì)控件的屬性

點(diǎn)擊左側(cè)欄的編輯按鈕,此時(shí)顯示的內(nèi)容,就是.ui文的本體了

image.png

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MyWidget</class>
 <widget class="QWidget" name="MyWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MyWidget</string>
  </property>
 </widget>
 <resources/>
 <connections/>
</ui>

看到這個(gè)格式有沒有一點(diǎn)熟悉,有點(diǎn)像html的標(biāo)簽?zāi)J?,但是呢這個(gè)格式被稱為xml格式
xml這里的標(biāo)簽是可以程序員自定義的,有點(diǎn)類似于網(wǎng)絡(luò)中的自定義應(yīng)用層協(xié)議。而html的標(biāo)簽是由標(biāo)準(zhǔn)委員會(huì)約定的,所有的瀏覽器也是按照約定來解釋的
Qt中使用xml文件就是描述程序的界面是啥樣的,再進(jìn)一步的qmake文件會(huì)調(diào)用相關(guān)的工具依據(jù)這個(gè)xml文件生成一些C++代碼,從而把完整的界面構(gòu)造出來。

5. .pro內(nèi)容解析

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mywidget.cpp

HEADERS += \
    mywidget.h

FORMS += \
    mywidget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

現(xiàn)在看到.pro Qt的工程文件,也是qmake工具構(gòu)建的重要依據(jù),注意:.pro類似Linux中的makefile文件是一個(gè)自動(dòng)化構(gòu)建工具
直接看總結(jié)版:

部分作用
QT += core gui添加 QtCore 和 QtGui 模塊(基礎(chǔ)功能和 GUI 支持)。
QT += widgetsQt 5+ 需要額外添加 QtWidgets 以使用 QWidget。
CONFIG += c++11啟用 C++11 語法支持。
DEFINES += QT_DEPRECATED_WARNINGS啟用 Qt 過時(shí) API 的警告。
SOURCES += main.cpp mywidget.cpp指定 .cpp 源文件。
HEADERS += mywidget.h指定 .h 頭文件。
FORMS += mywidget.ui指定 Qt Designer 的 .ui 文件。
target.path設(shè)置不同平臺(tái)的安裝路徑。
image.png

紅框中的內(nèi)容是描述當(dāng)前項(xiàng)目中,參與構(gòu)建的文件都有什么,這地方不需要手動(dòng)修改,qt Creator會(huì)幫我們自動(dòng)維護(hù)好。
上面我們看到的都是源代碼,其實(shí)在編譯運(yùn)行中還會(huì)產(chǎn)生一些中間文件。

打開文件自愿管理器,看看項(xiàng)目對應(yīng)的目錄是什么樣子~

image.png

image.png

在運(yùn)行一次程序后,就會(huì)在項(xiàng)目并列的地方多出來一個(gè)buildxxx目錄
這個(gè)目錄是用來存儲(chǔ)運(yùn)行過程中的臨時(shí)文件的。

image.png

打開目錄,看到了一個(gè)makefile文件,看來編譯Qt程序還是會(huì)用到makefile文件啊,由qmake自動(dòng)生成。
然后我們,再看到ui_mywidget.h文件,該文件是根據(jù)前面的xml文件自動(dòng)生成的,打開ui_mywidget.h文件:

/********************************************************************************
** Form generated from reading UI file 'mywidget.ui'
**
** Created by: Qt User Interface Compiler version 5.14.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MYWIDGET_H
#define UI_MYWIDGET_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MyWidget
{
public:

    void setupUi(QWidget *MyWidget)
    {
        if (MyWidget->objectName().isEmpty())
            MyWidget->setObjectName(QString::fromUtf8("MyWidget"));
        MyWidget->resize(800, 600);

        retranslateUi(MyWidget);

        QMetaObject::connectSlotsByName(MyWidget);
    } // setupUi

    void retranslateUi(QWidget *MyWidget)
    {
        MyWidget->setWindowTitle(QCoreApplication::translate("MyWidget", "MyWidget", nullptr));
    } // retranslateUi

};

namespace Ui {
    class MyWidget: public Ui_MyWidget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MYWIDGET_H

6. 總結(jié)

總結(jié)來說,Qt 初始代碼的結(jié)構(gòu)清晰且模塊化,充分體現(xiàn)了 Qt 框架的設(shè)計(jì)哲學(xué)。從 QApplication 的初始化到 QWidget 的父子管理機(jī)制,再到 .pro 文件的配置,每個(gè)部分都在確保應(yīng)用的穩(wěn)定性和可擴(kuò)展性。理解這些基礎(chǔ)代碼,不僅有助于掌握 Qt 的事件循環(huán)、窗口管理和資源組織方式,還能為后續(xù)的開發(fā)打下堅(jiān)實(shí)的基礎(chǔ)。希望這篇解析能幫助你更高效地入門 Qt,并為更復(fù)雜的應(yīng)用開發(fā)做好準(zhǔn)備。

到此這篇關(guān)于深入理解Qt 初始項(xiàng)目代碼的文章就介紹到這了,更多相關(guān)Qt 初始項(xiàng)目代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論