C++学习| QT快速入门_qt c++快速入门-程序员宅基地

技术标签: 学习  C++学习  c++  qt  

QT Creater

Qt Creator是使用Qt开发的IDE,集成了Qt Designer、Qt Assistant、Help等工具,可以在开发的时候使用Designer来可视化设计界面。

创建QT项目

打开QT Creater->“创建项目”。

后面的博客思路是跟着创建QT项目的步骤走的,但是会补充创建项目过程中遇到的概念。

选择项目类型——不同项目类型的区别

在这里插入图片描述

QT项目模板类型

  • Application(QT): “应用”项目生成可执行程序,针对C++。
  • Application(QT for Python):针对Python的 “应用”项目。
  • Library: “库” 项目生成静态库或动态库。
  • 其他项目:辅助类项目。
  • Non-Qt Project: “非Qt应用”项目。
  • Test Projection:测试程序,用来做测试的。

因为本篇文章要做得是QT C++软件的入门,所以选择Application(QT)。

Application(QT)分类

  • Qt Widgets Application:桌面应用软件。
  • Qt Console Application:控制台应用软件。
  • Qt Quick Application:移动应用软件。

选择QT大部分都是因为想用QT做界面,桌面应用的界面比较好入门学习,所以本文案例选择的Qt Widgets Application(桌面应用软件)。

输入项目名字和路径

输入项目名字和路径,注意项目名称不能包含空格与中文。包含的话,创建过程中不会报错,但程序无法运行出窗口。

选择合适的构建系统——不同构建系统的却别

构建系统类别分别是qmake、CMake和Qbs。

  • qmake:QT提供的默认构建系统工具,使用 .pro 文件来描述项目的配置和构建规则,是QT传统的构建工具,易于上手和使用。
  • CMake:跨平台的构建系统工具,使用 CMakeLists.txt 文件来描述项目的配置和构建规则,适用非QT和QT项目,语法相对复杂,但是更加灵活和强大,支持多种生成器例如Visual Studio工程。
  • Qbs:QT 5.7 版本引入的新型构建工具,使用 .qbs 文件来描述项目的配置和构建规则,语法更简洁和现代,更加模块化和可扩展化等。

这里选择qmake,因为qmake是QT默认提供的,参考也比较多,作为新手是一个比较好的入门选择。

选择合适的类——QT基本类之间的关系

在这里插入图片描述

Class name是类名,Header file后缀.h是头文件,Source file后缀.cpp是具体实现相关的文件,Form file后缀.ui是界面相关的资源文件。如果有用过别的可视化编程软件,应该对这种文件结构都并不陌生。

Base class选择主要有三种QMainWindow、QWidget和QDialog。

QT中的窗口和控件一般统称为部件(Widget),窗口指的是程序的整体界面,可以包含标题栏、菜单栏、工具栏各种控件等;控件是指各种按钮、复选框、文本框和进度条等。

QWidget是所有界面元素的基类,所以QMainWindow和QDialog是QWidget的两个派生类。QMainWindow就是窗口类,自动生成包含菜单栏、工具栏和标题栏等的界面。QDialog是对话框窗口类,会生成一个界面,但是没有菜单栏、工具栏、状态栏等,一般用来做短期任务。选QWidget会生成一个完全空白的窗口。

看自己需要的窗口类型选择QMainWindow或者QDialog,如果不确定,可以选择QWidget。

这里因为没有什么特殊的需求,所以选择了QWidget进行创建。

Translation File

如果项目需要做多语言翻译,可以选择,可以对界面中菜单栏、label、对话框等进行翻译。如果不需要的话,直接默认无就行了。

选择构建套件——MinGW和MSVC的区别

window下通常会有MinGW和MSVC可以选。

MinGW(Minimalist GNUfor Windows): 一个开源的编译器,是基于 GNU 工具链的 Windows 版本,比较轻量而且能够跨平台,但是和某些库可能不兼容。

MSVC(Microsoft Visual C++):由微软开发的VC运行时库,被Visual Studio IDE所集成,使用VS就会附带,可执行文件会比较大。

MinGW和MSVC的关系:MinGW和MSVC都是编译工具,但是两个编译工具兼容并不好。使用MinGW编译的使用,要用MSVC编译生成的库时就会有问题。使用MinGW编译项目的时候,所使用的Lib也要是MinGW编译的。根据自己调用的库是什么类型编译,可以选择不同的编译工具。

入门的话最好使用MinGW,如果有相关需求,可以根据自己需求选择。

简单案例:加法器

设计界面——构建加法器界面

如何进入设计界面

  • 点击相应的ui后缀文件。
  • 点击左边功能栏的“设计”,但是这个需要先点击过一次ui后缀文件。
    在这里插入图片描述

设计界面各个部分的功能
在这里插入图片描述

编排加法器界面,把需要的控件点击拖入到窗口界面中,并排列好。
在这里插入图片描述

控件文本修改方法,有两种方法:第一种,在控件属性中找到text进行修改;第二种,或者直接右键->“改变纯文本”。

QT还可以很方便对文本进行美化,可以像word那样对文本格式进行快速的修改,也有两种方法:

  • 在控件属性中找到text,后面会有“…”,点击即可跳转到文本美化功能。
    在这里插入图片描述

  • 直接右键控件->“改变格式文本”。

信号和槽——界面和代码交互原理

信号与槽(Signal & Slot)是QT的一个创新,用来方便处理各个组件的交互操作。类似于观察者模式,让互不干扰的对象之间建立一种联系,当信号发出适合,被来连接的槽函数就会自动被回调。

信号(Signal)是指的在特定情况下被发射的事件,例如PushButton被鼠标点击触发clicked事件信号。
除了部件自带的事件信号,也可以自定义信号,定义要求如下:

  • 信号是类的成员函数。
  • 返回值必须是void类型。
  • 信号需要使用signals关键字进行声明,类似public等关键字。
  • 信号只需要声明,不需要具体实现。
signals:
    void signal_01();
    void signal_01(QString);

(Slot)是对应信号响应的函数,和普通C++成员函数基本没有区别,唯一区别在于可以被信号触发。
自定义槽函数的要求如下:

  • 返回值必须是void类型。
  • 槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式(匿名函数)。
  • 槽函数的参数要和信号匹配,但可以小于信号的参数,因为槽函数是用来接受信号传递的数据。
public slots:
    void slot_01();
    void slot_01(QString);

关联信号和槽的方法

  • 自动关联:
    • 直接从控件ui右键->“转到槽”。
    • 按“on_对象名_事件名”的格式手动添加槽方法。
  • 手动关联:
    通过connect函数进行信号和槽的关联,connect使用格式如下:
    QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
    sender是信号的发送者(类对象),signal是发送的信号,receiver是信号的接收者(类对象),slot是处理函数(槽函数)。
    当sender调用了signal的时候,receiver当中的slot就会响应。

信号和槽之间的关系

  • 两者都是独立的个体,只因为交互的需求而关联到了一起。
  • 一个信号可以连接到多个槽。
  • 一个槽可以被多个信号连接。
  • 信号也可以连接到信号,例如某个信号发射会导致另一个信号发射。
  • 信号的参数可以大于等于槽函数的个数。

交互代码实现加法器

加法器的运作逻辑:输入两个整数,然后点击“相法”按钮会把两个数加起来显示在label中;点击取消会把两个输入框里面的数字清空。

修改控件ID:通常编程都不会用默认的控件ID,可以改为比较直观的命名,UI设计界面的左上角双击控件对象名字即可修改。
在这里插入图片描述
“加法”按钮响应:使用自动关联来设置“加法”按钮点击后响应的槽函数,右键“加法”按钮->“转到槽”->clicked(),test01.cpp中会出现void Test01::on_addButton_clicked()函,为on_addButton_clicked()添加加法代码逻辑即可。
在这里插入图片描述
在这里插入图片描述

“取消”按钮响应:“加法”按钮实现用的是自动关联,所以“取消”按钮的实现采用手动关联作为演示。编写一个不符合“on_对象名_事件名”自动关联命名格式的槽函数,然后用conncet关联“取消”按钮的“clicked”信号。

如果需要关联控件的信号找不到,可以在IDE的左边菜单中的帮助,选择“索引”搜索控件的类名,查看该类的所有信号Signals。
在这里插入图片描述

完整代码
test01.h

#ifndef TEST01_H
#define TEST01_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
    
class Test01;
}
QT_END_NAMESPACE

class Test01 : public QMainWindow
{
    
    Q_OBJECT

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

private slots:
    void on_addButton_clicked();// 加法按钮的槽函数声明
    void cancelButton_clicked();// 取消按钮的槽函数声明

private:
    Ui::Test01 *ui;
};
#endif // TEST01_H

test01.cpp

#include "test01.h"
#include "ui_test01.h"

Test01::Test01(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Test01)
{
    
    ui->setupUi(this);
    // 设置标题
    this->setWindowTitle("加法器");
    // 手动关联
    connect(ui->cancelButton, SIGNAL(clicked()), this, SLOT(cancelButton_clicked()));
}

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

void Test01::on_addButton_clicked()
{
    
    // 获取lineedit的数据
    QString a_str=ui->inputEdite1->text();
    QString b_str=ui->inputEdite2->text();
    // 把QString转为int
    int a=a_str.toInt();
    int b=b_str.toInt();
    // a和b相加
    int ans=a+b;
    // 设置结果显示在label上
    ui->label->setText("结果:"+QString::number(ans, 10));
}

void Test01::cancelButton_clicked(){
    
    ui->inputEdite1->clear();
    ui->inputEdite2->clear();
    ui->label->setText("结果:清空");
}

运行结果
加法
在这里插入图片描述

取消
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40306845/article/details/135730415

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签