QT入门基础(一)

news2024/11/25 15:38:10

文章目录

    • 零.Qt背景
      • 1.什么是Qt
      • 2.Qt的发展史
      • 3.Qt的优势
      • 4.Qt应用
    • 一.第一个Qt程序
      • 0.项目创建
      • 1.main函数文件
      • 2.类头文件
      • 3.pro文件
      • 4.qt命名规范
    • 二.Qt按钮
      • 1.按钮创建和父子关系
      • 2.按钮常用api
      • 3.Qt窗口坐标体系
      • 4.对象树模型

零.Qt背景

1.什么是Qt

  1. Qt是一个跨平台的C++图形用户界面应用程序框架

  2. 它为应用程序开发者提供建立图形界面所需的所有功能

  3. 它是完全面向对象的,很容易扩展,并且允许真正的组件编程

2.Qt的发展史

  1. 1991年 Qt最早由芬兰奇趣科技开发

  2. 1996年 进入商业领域,它也是目前流行的Linux桌面环境KDE的基础

  3. 2008年 奇趣科技被诺基亚公司收购,Qt称为诺基亚旗下的编程基础

  4. 2012年 Qt又被Digia公司(芬兰一家软件公司)收购

  5. 2014年4月 跨平台的集成开发环境Qt Creator3.1.0发布,同年5月20日配发了Qt5.3正式版,至此Qt实现了对iOS、Android、WP等各平台的全面支持

3.Qt的优势

  1. 跨平台,几乎支持所有的平台

  2. 接口简单,容易上手,学习QT框架对学习其他框架有参考意义

  3. 一定程度上简化了内存回收机制

  4. 开发效率高,能够快速的构建应用程序

  5. 有很好的社区氛围,市场份额在缓慢上升

  6. 可以进行嵌入式开发

4.Qt应用

  1. Linux桌面环境KDE(K Desktop Environment)

  2. WPS Office 办公软件

  3. Google Earth 谷歌地球

一.第一个Qt程序

0.项目创建

Qt的项目分为三个基类:QMainWindow,QWidget,QDialog

image-20230310204759993
  • 三个基类之间的关系:

image-20230310205138150

注:对于初学者创建Qwidget的项目就可以了

1.main函数文件

image-20230310204145688
  • 解释:
  1. Qt系统提供的类头文件没有.h后缀

  2. Qt一个类对应一个头文件,类名和头文件名一致

  3. QApplication表示应用程序类

  • 对于QApplication:
  1. QApplication管理图形用户界面应用程序的控制流和主要设置

  2. nQApplication类对象是Qt生命,一个程序要确保一直运行,就肯定至少得有一个循环,这就是Qt主消息循环,在其中完成来自窗口系统和其它资源的所有事件消息处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理

  3. 对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication 对象,不论这个应用程序在同一时刻有多少个窗口

  • a.exec():
  1. 程序进入消息循环,等待对用户输入进行响应

  2. 这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回

  3. 在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件

  • 执行a.exec()即类似于如下代码:

image-20230310205712470

2.类头文件

class HelloWidget : public QWidget
{
    //引入qt信号和槽的一个宏
    Q_OBJECT

public:
    //parent窗口指针,父窗口对象的指针
    //如果parent为0或者nullptr,表示当前窗口对象是一个顶层窗口
    //顶层窗口即为在任务栏可以找到的窗口
    HelloWidget(QWidget *parent = nullptr);
    ~HelloWidget();

private:

};

3.pro文件

#引入Qt的模块,core gui
QT       += core gui
#如果qt版本大于4,那么引入widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 表示使用过时的api 则会报错
DEFINES += QT_DEPRECATED_WARNINGS
#要编译的源文件列表
SOURCES += \
        main.cpp \
        mywidget.cpp
#要编译的头文件列表
HEADERS += \
        mywidget.h
# 默认的生成规则
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
  • .pro文件的规则:
  1. 注释:从“#”开始,到这一行结束

  2. 模块引入:QT += 模块名,表示当前项目引入Qt哪些模块

  3. 工程中包含的头文件:HEADERS += include/painter.h

  4. 工程中包含的源文件:SOURCES += sources/main.cpp sources

  5. 工程中包含的资源文件:RESOURCES += qrc/painter.qrc

  6. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets:如果QT_MAJOR_VERSION大于4(也就是当前使用的Qt5及更高版本)需要增加widgets模块

  7. 配置信息:CONFIG用来告诉qmake关于应用程序的配置信息,CONFIG += c++11 //使用c++11的特性(qt5.6以上版本默认使用C++11)

4.qt命名规范

类名:单词首字母大写,单词和单词之间直接连接,无需连接字符

MyClass,QPushButton
class MainWindow

Qt中内置的类型,头文件和类命名同名

#include <QString>
QSring str;
#include <QWidget>
QWidget w;

函数名字,变量名:首字母小写,之后每个单词首字母大写,单词和单词之间直接连接,无需连接字符

void connectTheSignal();

类的成员变量设置函数用使用 set+成员变量名,获取成员变量的函数直接用成员变量名(如果是bool类型,有可能会用一些表示状态的术语,如isVisilble,hasFocus):

//普通成员变量设置和获取
void setText(QString text);
QString text()const;
//bool的成员变量设置和获取
void setEnabled(bool enabled);
bool isEnabled()const;

二.Qt按钮

1.按钮创建和父子关系

在Qt程序中,最常用的控件之一就是按钮

#include <QPushButton>

QPushButton * btn = new QPushButton; 

//设置父亲
btn->setParent(this);
//设置文字
btn->setText("按钮1");
//移动位置
btn->move(100,100);
//第二种创建
QPushButton * btn2 = new QPushButton("按钮2",this);
//重新指定窗口大小
this->resize(600,400);
//设置窗口标题
this->setWindowTitle("第一个项目");
//限制窗口大小
this->setFixedSize(600,400);
  • 说明:
  1. 一个按钮其实就是一个QPushButton类的对象,如果只是创建出对象,是无法显示到窗口中的,就需要依赖一个父窗口,也就是指定一个父亲,而调用按钮的show()函数只能让按钮独立显示

  2. 利用setParent函数或者按钮创建的时候通过构造函数传参,此时我们称两个窗口建立了父子关系

  3. 在有父窗口的情况下,窗口调用show会显示在父窗口中,如果没有父窗口,那么窗口调用show显示的会是一个顶层的窗口

image-20230310213506669

2.按钮常用api

  1. 设置按钮上显示的文字可以用:setText()

  2. 移动按钮位置用:move()

  3. 修改左上角窗口的标题:setWindowTitle()

  4. 重新指定窗口大小:resize()

  5. 设置固定的窗口大小:setFixedSize()

  6. 同时设置窗只位置和大小:setGeometry()(相当于move和resize的结合体)

  • 示例:

image-20230310213710282

3.Qt窗口坐标体系

通过以上代码可以看出Qt的坐标体系

以左上角为原点(0,0),以向右的方向为x轴的正方向,以向下方向为y轴的正方向

img

对于嵌套窗口,其坐标是相对于父窗口来说的

顶层窗口的父窗口就是屏幕

4.对象树模型

QObject是Qt里边绝大部分类的根类

QObject对象之间是以对象树的形式组织起来的

当两个QObject(或子类)的对象建立了父子关系的时候。子对象就会加入到父对象的一个成员变量叫children(孩子)的list(列表)中

当父对象析构的时候,这个列表中的所有对象也会被析构

image-20230310214115071

QWidget是能够在屏幕上显示的一切组件的父类

QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。我们向某个窗口中添加了一个按钮或者其他控件(建立父子关系),当用户关闭这个窗口的时候,该窗口就会被析构,之前添加到他上边的按钮和其他控件也会被一同析构

Qt 引入对象树的概念,在一定程度上解决了内存问题

在 Qt 中尽量在构造的时候就指定 parent 对象,并且大胆在堆上创建

84AA8k-1678505328521)]

QWidget是能够在屏幕上显示的一切组件的父类

QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。我们向某个窗口中添加了一个按钮或者其他控件(建立父子关系),当用户关闭这个窗口的时候,该窗口就会被析构,之前添加到他上边的按钮和其他控件也会被一同析构

Qt 引入对象树的概念,在一定程度上解决了内存问题

在 Qt 中尽量在构造的时候就指定 parent 对象,并且大胆在堆上创建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/403369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速排序/快速选择算法

一.快速排序 1.基本介绍 快速排序&#xff08;Quicksort〉是对冒泡排序的一种改进,都属于交换排序。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分(每次选择中轴值)&#xff0c;中轴值左边的元素小于中轴值,中轴值右边的元素全部大于中轴值(但不要求有序)&#x…

Canvas详细使用方法(一)

Canvas Canvas的注意事项 < canvas > 和 < img > 元素很相像&#xff0c;唯一的不同就是它并没有 src 和 alt 属性。 -< canvas > 标签只有两个属性——width和height( 单位默认为px )。当没有设置宽度和高度时&#xff0c;canvas 会初始化宽为 300px 和高…

C#基础之面向对象编程(二)

总目录 文章目录总目录前言一、概述1. 定义2. 面向对象的三大特性二、封装1. 定义2. 属性三、继承1. 定义2. 继承的使用3. base 和this四、多态1. 定义2. 重写和重载3. 多态性的实现1、静态多态性2、动态多态性4. 向上转型和向下转型1、定义2、语法格式3、案例结语前言 本文主…

Docker常用项目实战演练

docker镜像源的修改 linux环境下编辑 /etc/docker/daemon.json vi /etc/docker/daemon.json #如添加如下网易镜像源 { "registry-mirrors": ["http://hub-mirror.c.163.com"] }docker run命令详细解释 日常工作中用的比较多的是docker run命令&#xff…

[ROC-RK3399-PC Pro] 手把手教你移植主线Buildroot(基于2023.02-rc3版本)

&#x1f347; 博主主页&#xff1a;Systemcall小酒屋&#x1f347; 博主简介&#xff1a;Neutionwei&#xff0c;C站嵌入式领域新星创作者之一&#xff0c;一枚热爱开源技术、喜欢分享技术心得的极客&#xff0c;注重简约风格&#xff0c;热衷于用简单的案例讲述复杂的技术&am…

机械学习 - 基础概念 - scikit-learn - 数据预处理 - 1

目录安装 scikit-learn术语理解1. 特征&#xff08;feature &#xff09;和样本&#xff08; sample / demo&#xff09;的区别&#xff1f;2. 关于模型的概念一、机械学习概念1. 监督学习总结&#xff1a;2. 非监督学习总结&#xff1a;3. 强化学习总结&#xff1a;三种学习的…

硬件基础常识【1】--如何让BJT工作在深度饱和区

引言BJT饱和的概念差不多的比喻特性曲线说明记忆NPN和PNP的小技巧- -保证一辈子不忘简单估算总结引言 学过模电或者做过一些电子作品的人都知道三极管这个器件&#xff0c;虽然是个小玩意&#xff0c;但在电路设计过程中承担了巨大的作用。BJT叫做双极结型三极管&#xff0c;可…

浏览器并发行为记录

使用nodejs koa起一个服务&#xff0c;使请求延时返回。 服务端代码 /** 延时 */ exports.timeoutTestData async function (ctx) {console.log(get query:, ctx.request.query);const query ctx.request.query;let timeout query.timeout || 2000;await new Promise(res…

vue专项练习

一、循环实现一个列表的展示及删除功能 1.1 列表展示 1、背景&#xff1a; 完成一个这样的列表展示。使用v-for 循环功能 id接口名称测试人员项目名项目ID描述信息创建时间用例数1首页喵酱发财项目a1case的描述信息2019/11/6 14:50:30102个人中心张三发财项目a1case的描述信…

Redis学习(13)之Lua脚本【环境准备】

文章目录一 Lua入门环境准备1.1 Lua简介1.2 Linux 系统安装Lua1.2.1 Lua 下载1.2.2 Lua 安装1.3 Hello World1.3.1 命令行模式1.3.2 脚本文件模式1.3.3 两种脚本运行方式1.4 Win安装Lua1.4.1 LuaForWindows的安装1.4.2 SciTE修改字体大小1.4.3 SciTE中文乱码1.4.4 SciTE快捷键工…

aws ecs 使用copilot快速创建ecs集群环境并部署服务

参考资料 https://github.com/aws/copilot-cli https://aws.github.io/copilot-cli/ https://github.com/aws-samples/amazon-ecs-cli-sample-app https://ecsworkshop.com/microservices/frontend/#deploy-frontend-0 ecs的服务部署从头开始需要进行以下操作 创建vpc等网…

JS中的事件、DOM操作

一、事件1.1 事件介绍事件: 就是发生在浏览器(页面)上一件事,键盘事件,鼠标事件,表单事件,加载事件等等1.2 事件绑定方式事件要想发生,就得将事件和标签先绑定一个完整的事件有三部分事件源(标签)什么事(事件)响应(动作效果)事件绑定,其实就是事件和标签绑定方式1: 事件源,事件…

IBM Semeru Windows 下的安装 JDK 17

要搞清楚下载那个版本&#xff0c;请参考文章&#xff1a;来聊聊 OpenJDK 和 JVM 虚拟机下载地址semeru 有认证版和非认证版&#xff0c;主要是因为和 OpenJ9 的关系和操作系统的关系而使用不同的许可证罢了&#xff0c;本质代码是一样的。在 Windows 下没有认证版&#xff0c;…

[计算机组成原理(唐朔飞 第2版)]第三章 系统总线(学习复习笔记)

3.1 总线的基本概念 计算机系统的五大部件之间的互连方式有两种 各部件之间使用单独的连线&#xff0c;称为分散连接将各部件连到一组公共信息传输线上&#xff0c;称为总线连接 总线是连接多个部件的信息传输线&#xff0c;是各部件共享的传输介质。 当多个部件与总线相连时&…

【java基础】LinkedList源码解析

文章目录基本介绍构造器基础方法linkFirstlinkLastlinkBeforeunlinkFirstunlinkLastunlinknodeindexOf方法分析总结基本介绍 在java中&#xff0c;LinkedList就是使用双向链表存储元素&#xff0c;既然是链表&#xff0c;那么也就知道了该数据结构擅长添加和删除。对于需要频繁…

线程等待/休眠/状态及 Runnable 和 Callable 的简单使用及原理

关于线程和进程的基本概念☛操作系统中线程和进程的概念理解 这篇文章已经有了很详细的解释, 接下来主要来讲讲线程等待与线程休眠 / 线程的几种状态 / Runnable 和 Callable 与 Thread 的概念和区别及 Executor 框架是什么样的. 关于线程1 线程等待与线程休眠2 线程一共有哪些…

[洛谷-P3698][CQOI2017]小Q的棋盘

一、问题 题目描述 小 Q 正在设计一种棋类游戏。 在小 Q 设计的游戏中&#xff0c;棋子可以放在棋盘上的格点中。某些格点之间有连线&#xff0c;棋子只能在有连线的格点之间移动。整个棋盘上共有 VVV 个格点&#xff0c;编号为 0,1,2,⋯,V−10,1,2,\cdots, V- 10,1,2,⋯,V−…

【C++知识点】C++11 常用新特性总结

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

EasyRcovery16免费的电脑照片数据恢复软件

电脑作为一种重要的数据储存设备&#xff0c;其中保存着大量的文档&#xff0c;邮件&#xff0c;视频&#xff0c;音频和照片。那么&#xff0c;如果电脑照片被删除了怎么办&#xff1f;今天小编给大家介绍&#xff0c;误删除的照片从哪里可以找回来&#xff0c;误删除的照片如…

win10打印机拒绝访问解决方法

一直以来,在安装使用共享打印机打印一些文件的时候&#xff0c;会遇到错误提示&#xff1a;“无法访问.你可能没有权限使用网络资源。请与这台服务器的管理员联系”的问题&#xff0c;那为什么共享打印机拒绝访问呢&#xff1f;别着急&#xff0c;下面为大家带来相关的解决方法…