QT引入及基本介绍

2023-10-27

嵌入式项目的图形解决方案

- ucOS + us/GUI (STM32)
- Linux + QT

QT

https://download.qt.io/new_archive/qt/
教程:http://c.biancheng.net/view/3871.html

  • 跨平台的C++ GUI(图形图像接口)应用程序开发架构。
    • 可以在不同平台下运行(windows, linux, 嵌入式linux, android…)
    • 面向对象,良好的封装机制,模块化程度高。提供了signals信号/slots槽 的安全类型来替代callback,简化各个元件之间的协同工作。
    • 丰富的API,500个以上的C++类,还提供基于模板的collections, serialization, file, I/O device, directory management, date/time类,正则处理。
    • 大量开发文档
  • 集成开发工具, 包含一组类库,可以开发GUI程序,也可以开发非GUI程序。
  • 应用:工业机器人、大型服务器开发、游戏领域、三维动画、嵌入式领域

跨平台的实现

  • 基于不同的平台(window\linux\嵌入式Linux)有不同的QT类库,功能一致。但所有平台QT类库对上层(QT类库应用层接口)提供同样的访问接口。=》基于QT类开发跨平台的GUI 应用

qmake vs cmake

base class: QWidget\QMainWindow\QDialog

  • QWidget类是所有用户界面对象的基类
  • QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。
  • QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。

kits

Hello World

创建项目

hello.pro项目文件

  • 主要用于makefile编译
QT       += core gui  //指定QT调用到的模块, 网络编程时可能需要加入network网络模块
TARGET = hello  // makefile要用的,指定应用程序名字
TEMPLATE = app  // 应用程序类型
SOURCES += ... // 包含哪些.cpp源文件
HEADERS += ... // 头文件
FORMS += ... // 窗体文件

.ui 设计

  • 编译生成ui_hellowidget.h文件(build-hello-Desktop_Qt_5_11_3_MinGW_32bit-Debug生成文件中的)

生成文件ui_hellowidget.h

  • 声明了一个Ui_MainWindow类:描述图形界面
    • 界面成员
    • 成员函数setupUi:鉴别图形界面
    BtnShowHello = new QPushButton(centralWidget);    
    BtnShowHello->setObjectName(QStringLiteral("BtnShowHello"));  // 设置名字
    BtnShowHello->setGeometry(QRect(240, 70, 141, 51));  // 设置大小
    
  • 声明一个Ui的命名空间
    • 声明MainWindow(HelloWidget)类

.h 槽函数声明

public slots:
    //槽函数声明,与按钮对象相关联
    void BtnHelloSlot(void);  // 界面类MainWindow的成员函数

.cpp 槽函数定义

void MainWindow::BtnHelloSlot(void)  //实现类中的槽函数
{
    ui->LabelHello->setText("Hello World");  // 为ui中的LabelHello设置文本
}

.cpp 信号与槽函数关联

connect(ui->BtnShowHello, SIGNAL(clicked(bool)), this, SLOT(BtnHelloSlot()));  //ui->BtnShowHello的点击信号与当前对象的BtnHelloSlot槽函数关联

完整代码解析

mainwindow.h(hellowidget.h) , mainwindow.cpp (hellowidget.cpp)窗体类文件

  • 文件
    • hellowidget.h =》类的头文件,声明类
    • hellowidget.cpp =》 类的实现文件,实现了类的成员函数
  • mainwindow(hellowidget)类:主界面窗体类,继承自Widget类
// hellowidget.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>  // 1. 头文件

// 2. 声明命名空间ui
namespace Ui {
class MainWindow;
}

// 3. 声明一个HelloWidget类
// 3.1 MainWindow是由QMainWindow类采用公共继承的方式继承来的(与Ui中MainWindow不同,命名空间不一样)
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);  // 3.2 构造函数(包含一个指向parent的指针)
    ~MainWindow();  // 3.3 析构函数

public slots:
    // 3.3 槽函数声明,与按钮对象相关联
    void BtnHelloSlot(void);  // 界面类MainWindow的成员函数

private:
    // 3.4 类的私有成员, MainWindow类型(ui_hellowidget.h中Ui的类)
    // MainWindow类由ui_hellowidget.h中Ui_MainWindow类继承来的
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
// hellowidget.cpp
#include "hellowidget.h"
#include "ui_hellowidget.h"

/*
 * 类的实现文件
 */

// 2. 构造函数
// 派生类的构造函数需要调用基类的构造函数QMainWindow(parent)
// 参数列表ui(new Ui::MainWindow)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)  // 相当于ui = new Ui::MainWindow, new出一个对象来初始化ui
{ 
    // 2.1 创建主窗体界面(ui_hellowidget.h中Ui_MainWindow类函数)
    ui->setupUi(this);

    // 2.2 调用connect函数 将btn点击信号与当前对象的BtnShowHelloSlot槽函数关联
    connect(ui->BtnShowHello, SIGNAL(clicked(bool)), this, SLOT(BtnHelloSlot()));
}

// 3. 析构函数:清除类资源
MainWindow::~MainWindow()
{
    delete ui;
}

// 1. 实现类中的槽函数
void MainWindow::BtnHelloSlot(void)
{
    ui->LabelHello->setText("Hello World");  //设置文本
}

main.cpp

  • main函数:定义应用程序对象和主窗体对象,显示主窗体,运行应用程序。
#include "hellowidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);  // 1. 定义应用程序类QApplication
    MainWindow w;  // 2.定义主窗体类MainWindow(hellowidget.h中)的对象
    w.show();  // 3.显示主窗体

    return a.exec();  // 4. 运行应用程序,需要把主窗体关掉才返回
}

事件处理机制

Qt程序是事件驱动的,程序的每个动作都是由幕后某个事件所触发,Qt事件的发生和处理成为程序运行的主线,存在于程序的整个生命周期。
当调用QApplication::exec()时,就进入了事件循环,应用程序就开始等待并处理事件。

  • 键盘事件:按键按下和松开
  • 鼠标事件
  • 拖放事件
  • 滚轮事件
  • 绘屏事件:重绘屏幕的某些部分
  • 定时事件

QDebug调试

输出结果在“3应用程序输出”中查看

# include<QDebug>
int conter = 0;

// 方法1
qDebug("connect ok %d\n", conter);

// 方法二
qDebug<<"hello world"<<endl;

信号和槽

  • Qt核心机制,应用于对象之间的通信
  • 是Qt的核心特征,也是Qt差别于其他工具包的重要地方。
  • 当一个对象的状态发生改变时,通过信号的方式通知其他对象(不指定发给哪个对象),其他对象通过执行相应的槽函数响应该信号。

signals信号

class cName
{
	signals:
		// 信号定义
		void mySinal();  // 1
		void mySignalParam(int x, int y);  // 2 可以带参数,但不是函数定义
}

slots槽函数(类的成员函数)

  • 可以像调用类的成员函数一样来调用槽函数
  • 与普通类的成员函数区别:可以跟信号建立起关联
class cName
{
	public slots:
		// 公有插槽: 可以跟任何信号关联
		void mySlot();
		void mySlotParam(int x, int y);
	protected slots:
		// 保护插槽:只能跟该类及其子类信号关联
	private slots:
		// 私有插槽:只能跟该类本身的信号关联
}

PS: 如果一个信号跟多个槽函数建立起了关联,一旦信号发生,与它建立关联的槽函数都会执行,谁先谁后不能确定

使用 emit

  • signal一般在事件的处理函数中发出,利用emit发射信号。
  • 如果一个类要使用信号与插槽机制,它就必须是从QObject或者其子类继承,而且在类的定义中必须加上Q_OBJECT宏
    • QObject类是所有Qt类的基类
class MainWindow : public QMainWindow
{
    Q_OBJECT  // 宏定义
    ...
}
  • 信号的参数是实参,槽函数形参的实参从信号传过来 =》确保信号的参数类型与参函数形参类型一致

connect()信号与槽函数关联

disconnect()取消信号与槽函数之间的关联

  • 不常用,对象被删除后自动取消这个对象所包含的所有连接

实例

// .h
class MainWindow : public QMainWindow
{
...
public slots:
	void BtnHelloSlot(void);
    void mysignalSlot(void);  // 4 槽函数

signals:
    void mysignal();  // 4 自定义信号
...
}

// .cpp
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{ 
    ui->setupUi(this);
    connect(ui->BtnShowHello, SIGNAL(clicked(bool)), this, SLOT(BtnHelloSlot()));
    connect(this, SIGNAL(mysignal()), this, SLOT(mysignalSlot()));  // 4 关联
}

// 4 槽函数
void MainWindow::mysignalSlot(void)
{
    ui->lineEdit->setText("Hello World");
}

void MainWindow::BtnHelloSlot(void)
{
    ui->LabelHello->setText("Hello World"); 

    emit mysignal();  // 4.发射信号

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT引入及基本介绍 的相关文章

  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 如何将 zlib 添加到现有的 qt 安装中

    如何将 zlib 添加到 Qt 的现有安装中 我对此很陌生 所以请给我详细的描述 提前感谢您的帮助 zlib 包含在 Qt 核心库中 如果你想在 Qt 程序中使用 zlib 函数 你只需要包含 src 3rdparty zlib 中的 zl
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • Qt GUI 应用程序中的控制台输出?

    我有一个在 Windows 上运行的 Qt GUI 应用程序 它允许传递命令行选项 在某些情况下我想向控制台输出一条消息 然后退出 例如 int main int argc char argv QApplication a argc arg
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这

随机推荐

  • 猿创征文

    内存管理实现单链表的插入和删除 1 收获 2 什么是单链表 3 节点的创建 4 主函数的实现 5 子函数的实现 5 1 AollocNode的实现 5 2 HeadInsertNode的实现 5 3 ShowNode的实现 5 4 Head
  • KB2871997补丁绕过

    KB2871997补丁绕过 微软为了防止用户的明文密码在内存中泄露 发布了KB2871997补丁 关闭了Wdigest功能 Windows Server2012及以上版本默认关闭Wdigest 使攻击者无法从内存中获取明文密码 Window
  • 24. 两两交换链表中的节点

    给你一个链表 两两交换其中相邻的节点 并返回交换后链表的头节点 你必须在不修改节点内部的值的情况下完成本题 即 只能进行节点交换 输入 head 1 2 3 4 输出 2 1 4 3 示例 2 输入 head 输出 示例 3 输入 head
  • php 验证只能输入姓名,php 检查输入用户名是否符合规定示例

    这篇文章主要为大家详细介绍了php 检查输入用户名是否符合规定示例 具有一定的参考价值 可以用来参考一下 对php检查输入的用户名是否符合规定感兴趣的小伙伴 下面一起跟随512笔记的小编两巴掌来看看吧 php检查输入的用户名是否符合规定 p
  • 【热门框架】Mybatis-Plus条件查询的三种格式

    Mybatis Plus 提供了三种常用的条件查询方式 分别是 Wrapper QueryWrapper LambdaQueryWrapper Wrapper Wrapper 是一个接口 提供了若干个构造方法 可以用来构建 where 条件
  • C++可变参数模板

    可变参数模板 接受可变数目参数的模板函数或模板类 将可变数目的参数成为参数包 有模板参数包和函数参数包 模板参数包 表示零个或多个模板参数 函数参数包 表示零个或多个函数参数 例如 template
  • 数据挖掘note(1)

    数据挖掘一般分为机器学习和统计学习 大数据学的课程一般是关于机器学习 我们学的浅 主要关于统计学习 示意图如下所示 这是一个大数据时代 但是数据挖掘的利用率不足0 5 可见数据挖掘的空间巨大 问题 数据挖掘对信息安全有什么用 例如从几十万条
  • VTM2.0+360lib-7.0配置环境

    全景视频编码跟普通的视频编码不一样 在VTM平台下还需要配置一个360lib 这里贴一下VTM和360lib的地址 VTM下载地址 360lib下载地址 提示一下 VTM可以直接在网站上下载zip版本 360lib要svn的方法下载 下载下
  • 戏开发unity编译和调试系列:The type or namespace name ‘NativeList<>‘ could not be found

    The type or namespace name NativeList lt gt could not be found are you missing a using directive or an assembly referenc
  • intellij idea如何将基于Springboot的web项目打成war包

    intellij idea如何将基于Springboot的web项目打成war包 详细内容请参看 https ms200 cn p 791
  • flink接入Kafka报错:timeout expired while fetching topic metadata

    简单的flink接入kafka结果报错 代码 create env val env StreamExecutionEnvironment getExecutionEnvironment set parallelism env setPara
  • 测试员不可不知的几款bug管理工具

    根据每个公司性质的不同 规模的不同 所用到的bug管理工具也可能不同 你们用的bug管理工具是什么呢 下面介绍几款主流的bug管理工具 1 JIRA 付费 JIRA JIRA的生产者把JIRA定义为Professional Issue Tr
  • Git:Git中的分支管理

    文章目录 分支是什么 创建分支 分支切换 合并分支 删除分支 合并冲突 合并模式 分支策略 bug分支 强制删除分支 本篇主要总结的是Git中的分支管理 分支是什么 在Git中 一个强大的功能就是分支 由前面的学习可以知道 当我们每次进行c
  • Java中double精度丢失如何处理

    图片来自网络 代码审查 CodeReview 是一种可以有效提高代码质量的方法 他可以帮助团体提高产品代码质量 提高产品的稳定性 更容易维护的代码会带来更少的技术债务 从整体上看 提高了软件开发和迭代的效率 double精度丢失现象 程序开
  • HashMap面试相关问题

    1 HashMap的底层实现原理 HashMap的底层是数组 链表的方式 通过Hash算法决定每个元素的存储位置 当程序执行map put 方法时 系统会调用hashcode 方法来得到他的hash值 通过hash值来确定该元素的存储位置
  • 网络基础:路由器工作原理

    目录 一 理论 1 路由器工作原理 2 路由表获取方式 3 路由器和交换机的区别 二 实验 1 华为系统配置2台路由器 2 华为系统配置3台路由器 3 华为系统配置浮动路由 一 理论 1 路由器工作原理 路由器工作在OSI七层协议中的第三层
  • AD画PCB时如何修改编辑区(黑色部分)

    今天同事提出这个问题 心中暗喜 又到我发光的时候了 结果 WHAT 没研究明白 小姐姐明明之前会N种方法的呀 赶紧问度娘 问题解决 应该是ad不同版本指令不太一样了 方法一 直接在KEEPOUT层画出想要的板框大小 方向 选中状态 执行DE
  • linux C错误汇集

    问题一 22 c In function main 22 c 8 9 error empty character constant 解决方法 少了空格 问题2 没有连接到math函数库 gcc 12 c o 12 lm 问题3 segmen
  • 如何在Cocos2d-x中集成安卓版微信SDK

    本文转载于 http www cocoachina com bbs read php tid 224616 1 概述 微信的火热程度已不必说了 如果能在Cocos2d x中集成微信SDK 让游戏能分享给好友或者朋友圈 那对游戏推广将会是非常
  • QT引入及基本介绍

    文章目录 嵌入式项目的图形解决方案 QT 跨平台的实现 qmake vs cmake base class QWidget QMainWindow QDialog kits Hello World 创建项目 hello pro项目文件 ui