码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Qt 学习(二) —— Qt工程基本文件详解


    Qt系列教程总目录

    文章目录

        • 1. pro文件内容解释
        • 2. main文件内容解释
        • 3. widget.cpp/widget.h文件内容解释
        • 4. ui_widget.h文件内容解释
        • 5. widget.ui文件内容解释

    以Widget窗口部件项目为例,新建的工程目录有如下几个文件:

    在这里插入图片描述

    QtCreator软件将他们做了如下分组,包含三个文件夹和一个.pro文件:

    在这里插入图片描述

    他们的作用分别为:

    • .pro文件:项目文件,定义项目相关信息,是qmake用来生成makefile文件的中间文件;
    • .pro.user文件:定义与用户相关的项目信息;
    • /Headers文件夹:存放头文件;
    • /Sources文件夹:存放源文件;
    • /Forms文件夹:存放ui文件;

    1. pro文件内容解释

    详见Qt 学习(二) —— .pro文件详解

    2. main文件内容解释

    以Widget窗口部件项目为例,解释一下main函数内容:

    #include "widget.h"
    
    #include 
    
    // Qt应用程序入口
    // main()函数主要执行一些初始化工作,然后将控制转交给Qt库
    // 然后Qt库通过事件向程序告知用户行为
    int main(int argc, char *argv[])
    {
        // Qt应用程序类,实例化Qt应用程序对象a
        QApplication a(argc, argv);
        // 创建一个窗口对象,这里调到widget.cpp中
        Widget w;
        // 窗口部件默认不可见,要调用show()方法使它可见
        w.show();
        // 程序进入消息循环,即main()函数将控制权转交给Qt
        // 当应用程序退出的时候,exec()函数就会返回
        // 在exec()函数中,Qt接收处理用户和系统的事件并将它们传递给适当的窗口部件
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3. widget.cpp/widget.h文件内容解释

    在main函数中实例化了Widget窗口对象,这里介绍一下widget.cpp和widget.h中的代码:

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h" // 窗口ui头文件,用于初始化ui及拖拽控件对象
    
    // Widget构造函数
    // 其中将ui初始化为Ui::Widget,该类位于ui_widget.h中,用于初始化ui及拖拽控件对象
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        // 为Ui对象传入当前窗口对象指针
        // 即将当前窗口对象与其Ui绑定
        ui->setupUi(this);
    }
    
    // Widget析构函数
    Widget::~Widget()
    {
        delete ui;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    widget.h

    // 条件编译,防止头文件被重复引用
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    
    // QT的命名空间,其实就是C++的命名空间封装了一层,如下是该宏定义:
    // # define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
    // # define QT_END_NAMESPACE }
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; } // 声明Ui命名空间下的Widget类
    QT_END_NAMESPACE
    
    // 定义Widget类
    class Widget : public QWidget
    {
        // Q_OBJECT宏用于提供Qt信号槽和元对象系统服务
        // 它必须限定为私有访问权限
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private:
        // 创建Ui::Widget类型的指针,用于操作ui界面及其控件
        Ui::Widget *ui;
    };
    #endif // WIDGET_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    4. ui_widget.h文件内容解释

    该文件初始化了ui及拖拽控件对象,由widget.ui文件生成,所以不能手动修改,即使修改也会在下次编译被覆盖。

    #pragma once // 避免头文件被重复引用
    // Qt头部声明
    /********************************************************************************
    ** Form generated from reading UI file ''
    **
    ** Created by: Qt User Interface Compiler version 6.3.0
    **
    ** WARNING! All changes made in this file will be lost when recompiling UI file!
    ********************************************************************************/
    
    #include 
    #include 
    #include 
    
    QT_BEGIN_NAMESPACE
    
    // 该类用于初始化ui及拖拽控件对象
    class Ui_Widget
    {
    public:
    
        // 该函数用于初始化窗口及创建窗口中的控件对象
        void setupUi(QWidget *Widget)
        {
            if (Widget->objectName().isEmpty())
                Widget->setObjectName(QString::fromUtf8("Widget"));
            Widget->resize(800, 600);
    
            retranslateUi(Widget);
    
            // Qt元对象系统生成信号与槽的连接
            // 递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到对象插槽
            // 所连接的槽函数要按特定形式的定义,如下:
            // void on__();
            QMetaObject::connectSlotsByName(Widget);
        } // setupUi
    
        // 动态翻译Ui界面的文字,用于国际化
        void retranslateUi(QWidget *Widget)
        {
            Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));
        } // retranslateUi
    
    };
    
    namespace Ui {
        // 声明Ui对应的类继承于该Ui类
        class Widget: public Ui_Widget {};
    } // namespace Ui
    
    QT_END_NAMESPACE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    5. widget.ui文件内容解释

    该文件为xml格式,类似于HTML,用于表示ui界面,Qt根据该文件生成ui_widget.h文件,Qt Creator可将其解析为图形界面,文件内容如下:

    
    <ui version="4.0">
     <class>Widgetclass>
     <widget class="QWidget" name="Widget">
      <property name="geometry">
       <rect>
        <x>0x>
        <y>0y>
        <width>800width>
        <height>600height>
       rect>
      property>
      <property name="windowTitle">
       <string>Widgetstring>
      property>
     widget>
     <resources/>
     <connections/>
    ui>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    对应的图形界面如下:

    在这里插入图片描述

    添加一个按钮,文件内容如下:

    
    <ui version="4.0">
     <class>Widgetclass>
     <widget class="QWidget" name="Widget">
      <property name="geometry">
       <rect>
        <x>0x>
        <y>0y>
        <width>800width>
        <height>600height>
       rect>
      property>
      <property name="windowTitle">
       <string>Widgetstring>
      property>
      <widget class="QPushButton" name="pushButton">
       <property name="geometry">
        <rect>
         <x>140x>
         <y>140y>
         <width>231width>
         <height>71height>
        rect>
       property>
       <property name="styleSheet">
        <string notr="true"/>
       property>
       <property name="text">
        <string>PushButtonstring>
       property>
      widget>
     widget>
     <resources/>
     <connections/>
    ui>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    对应的图形界面如下:

    在这里插入图片描述

  • 相关阅读:
    Hadoop的配置
    前端传递bool型后端用int收不到
    零基础学前端(一) 前端开发环境:vscode、chrome 完成最基础的代码编写和运行
    神经网络的数学原理
    前端学习记录~2023.8.19~JavaScript重难点实例精讲~第7章 ES6(2)
    5.Vue-在Vue框架中实现Vue的增删改查
    软件测试是个青春饭,怎么才能避免35岁危机?我想吃一辈子
    python-批量操作excel
    CSAPP Lab4: Cache
    【LLM】主流大模型体验(文心一言 科大讯飞 字节豆包 百川 阿里通义千问 商汤商量)
  • 原文地址:https://blog.csdn.net/maizousidemao/article/details/127956597
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号