这里写目录标题
- qt基类介绍
- qt不同版本
- qt下载
- 打开qt creater
- 制作简单qt界面
- ui界面
- 点击forms,双击ui文件,就可以进入ui编辑器
- qt信号和槽
- 给界面增加图片
- 界面布局
- 布局不会影响代码
- 界面切换
- 更改代码
- 验证账号密码
- qt的三驾马车
- 串口助手
- 为下拉框加入属性信息
- 串口号栏设置
- 进一步配置
- 串口实现逻辑功能
- 初始化串口, 利用打开按钮 触发串口打开,这用到信号槽
- 关闭功能
- 接收功能
- 发送功能 和 清空功能
- Q_OBJECT
- 宏定义
- explicit
- private slots
- 打包为windows软件
- 封包操作 需要用到qt的控制台
- exe需要相应的动态依赖库才能执行
qt基类介绍
在Qt中,创建工程时基类QWidget表示创建一个基于 QWidget 的窗口应用程序,而其他选项则表示不同类型的应用程序。
下面是几个常见的Qt工程类型及其对应的选项:
- 控制台应用程序(Console Application):使用QCoreApplication作为应用程序类,没有图形用户界面。
- 主窗口应用程序(Main Window):使用QMainWindow作为主窗口,可以通过添加菜单栏、工具栏等功能来创建复杂的应用程序。
- 对话框应用程序(Dialog):使用QDialog作为主窗口,常用于包含少量控件的小型应用程序或功能性对话框。
- 控件应用程序(Widget):使用QWidget作为主窗口,可以自由布局和组合多个控件,适用于自定义控件和复杂的用户界面。
除了上述常见的类型,Qt还提供了很多其他类型的应用程序模板,比如OpenGL应用程序、Qt Quick应用程序等。每个模板都有其特定的用途和功能,开发者可以根据实际需求选择并进行定制。
需要注意的是,选择不同类型的应用程序会影响生成的代码和文件结构,但不会限制你使用任何Qt库或控件。因此,在选择应用程序类型时,应该根据实际需求选择最合适的类型,并根据需求使用Qt提供的各种功能和工具来进行开发。
qt不同版本
https://blog.csdn.net/weixin_43577616/article/details/120889646
qt下载
视频中推荐5.11.1版本,选择相应的系统安装包。
例如 windows为exe,mac为dmg,linux为run
注册账号密码进行安装,安装路径不能有中文。
选择安装组件
组件有对应的联系配置
视频中勾选了mingw , android x86,android armv7
勾选 qt visual keyboard, qt script
tools中qt creater 4.6.2,第二个mingw
打开qt creater
创建cpp工程
pro文件为配置文件
制作简单qt界面
qt工程创建,application
工程文件分析
ui界面
点击forms,双击ui文件,就可以进入ui编辑器
ui面编辑板
q label
q line edit echo mode
push button
直接编译,编译成功后直接弹出界面
qt信号和槽
1 为了方便分析代码,给相应的控件改名
2 信号就是 相应控件发出的特定信号
帮助 索引 查找 pushbutton
槽就是函数的意思,把槽函数绑定在一个控件的信号上
3 关联槽和信号
一个按钮关联槽函数
自动关联,手动选择相应空间,右键转到槽
他会现在widget.h里面声明槽函数
槽函数只能声明到private slots或者public里面
widget.cpp内实现槽函数
手动关联
使用connect函数,需要和自动一样在h文件里声明该函数( logoBt_clicked_clots() )
connect当对象a发出b信号时候就会出发c引起d
给界面增加图片
1 class工程文件夹添加文件
qt – qt resource file ------ 文件名为 pic.qrc
2 把图片添加到工程下
pic.qrc 右键 open with 资源编辑器
3 修改前缀
ctrl + s 保存, 添加—添加文件,选中图片
4 引用这个图片,打开ui界面。拖入label,删除文字,改变样式表。
添加资源,选中图片
5 添加文字,加入label,同样可以为相应的按钮增加图片
6 图标下载 easyicon
界面布局
qt下有三种布局,在工具栏上方,企鹅最小尺寸设置
1 水平布局
2 垂直布局
3 栅格布局
选中所有垂直布局
栅格布局
界面也会随着放大缩小变换
放置horizontal spacer
布局不会影响代码
界面切换
1 创建1个新的ui界面
2 工程class添加新文件, qt 设计师界面类, 选择 weigdt
3 设计新的界面,将其界面大小与之前的设计为一样
4 添加多个按钮和 图片
设置弹簧 水平布局
更改代码
在 widget.cpp文件中,加入新的设置代码
1 加入头文件
include “ctrl。h”
登录触发代码,进入到新的窗口
设置返回代码
转到槽
相当于关闭窗口
验证账号密码
在相应的登录接口中添加代码
Void Widget::logoBt_clicked_slots()
{
QString unsename = ui->userEdit->text();
QString passwad = ui->passwdEdit->text();
if(userName=="123" && passwad=="xxx")
{ ctrl *ct = new ctrl;
ct->setGeometry(this->geometry());
ct->show();
}
ctrl *ct = new ctrl;
ct->setGeometry(this->geometry());
ct->show();
}
qt的三驾马车
1 串口编程
2 网络编程
3 qt下的GPIO
串口助手
1 新建工程 qt widget工程
做好ui界面
实现逻辑功能
接收框使用 plain text edit,设置read only
相应的下拉候选框 combo box 以及label
发送框 line edit
按钮 pushbutton
groupbox 容器 用于广告文字显示
label设置最小大小,栅格布局
为下拉框加入属性信息
选中拉框框 双击 直接编辑,通过 + 号添加,以及通过 上下 调整位置
要对 整体复选框和label 进行删格排列,否则会整齐大小不一
需要对相应复选框设置常用默认值,
选中相应目标,在右侧设置一栏设置
串口号栏设置
将 下拉框 名称设置为 seialCb
相应的波特率,数据为,停止位等都设置名字
相应的按钮以及发送接收框也是
进一步配置
在seial.pro里配置代码
添加模块
QT += core gui serialport
接着在 widget.cpp内
添加头文件
#include <QSerialPortInfo>
添加了 qstringlist 以及 foreach查找端口名并加入string list 然后把 端口名给到ui的seialcb输出
串口实现逻辑功能
在widget.h中设置
添加头文件
#include <QSerialPort>
在widget.cpp中设置
建立一个串口对象,将外部传入的this指针作为参数进行初始化
初始化串口, 利用打开按钮 触发串口打开,这用到信号槽
两种方式 1 connect函数 2 右键 转到槽
widget.cpp中
在槽函数中设置
在下面
if(ui->baundrateCb ->currentText() == "4800"){
baudRate = QSerialPort::Baud4800;
}
else if(ui->baundrateCb ->currentText() == "9600")
{}
else if(ui->baundrateCb ->currentText() == "115200")
{}
报错,应该是SetPortName
这里往下添加
需要头文件 #include<QMessageBox>
if(serialPort->open(QIODevice::ReadWrite) == true)
{
QMessageBox::information(this,"提示","chenggong");
}else{
QMessageBox::critical(this,"提示","失败");
}
关闭功能
接收功能
在相应位置 foreach前面加入
connect(serialPort, SIGNAL(),this,SLOT());
可查找serialport有哪些信号
connect(serialPort, SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_Slot()));
当串口有东西可读就会触发槽函数,把读到的buf显示到ui框中
在widget.h中声明槽函数
在 private slots下
void serialPortReadyRead_Slot();
在widget。cpp中实现,添加头文件 #include<Qstring>
void serialPortReadyRead_Slot()
{
QString buf;
buf = QString(serialPort->readAll()); 他这里serial 还是 serila有点分不清了
ui->recvEdit->appendPlainText(buf);
}
发送功能 和 清空功能
发送按钮右键转到槽,关联clicked()
在widget.cpp中
类内声明,类外实现
void Widget::on_sendBt_clicked()
{
serilaPort->write(ui->sendEdit->text().toLocal8Bit().date());
}
Q_OBJECT
Q_OBJECT 是 Qt 宏定义中的关键字之一,用于启用 Qt 的元对象特性。元对象特性是一种 Qt 框架提供的机制,可以实现以下功能:
- 对象的动态属性(通过 Q_PROPERTY 宏定义)
- 信号和槽机制(通过 signals 和 slots 关键字)
- 静态元对象信息(通过 metaObject() 函数)
在使用上述特性时,需要在类的声明中添加 Q_OBJECT 宏,以便 Qt 编译器能够将该类转换为元对象。当程序运行时,Qt 框架会为每个具有 Q_OBJECT 宏的类创建一个元对象,其中包含类的静态元信息,如类名、信号的名称和参数、槽的名称和参数、以及动态属性的名称和类型等。
需要注意的是,当添加或修改 Q_OBJECT 宏后,需要运行 Qt 的元对象编译器(MOC)来生成相应的源代码文件。这是因为,在 Qt 框架中,信号和槽机制是通过 MOC 来实现的,而 MOC 只会处理包含 Q_OBJECT 宏的头文件。
总之,Q_OBJECT 宏是使用 Qt 元对象特性的必要条件之一,它可以让开发者更加方便地使用 Qt 框架的众多特性,并且可以使用 Qt Creator 等集成开发环境自动为代码生成 MOC 处理后的代码文件。
宏定义
宏定义(Macro Definition)是一种预处理指令,用于将一个标识符或代码片段替换为指定的文本。在C、C++、Objective-C等编程语言中,宏定义可以通过 #define 关键字来创建。
宏定义的基本语法如下:
#define 宏名 子串
其中,宏名是要定义的标识符,子串则是用于替换宏名的文本或代码片段。当程序中出现宏名时,编译器会将其替换为子串,并在编译之前进行预处理。
例如,以下代码定义了一个宏 MAX,表示取两个值的最大值:
#define MAX(a, b) ((a) > (b) ? (a) : (b))
当程序中出现 MAX(a, b) 时,编译器会将其替换为 ((a) > (b) ? (a) : (b)),并在编译之前进行预处理。因此,下面的代码:
int x = 10, y = 20;
int z = MAX(x, y);
会被替换为:
int x = 10, y = 20;
int z = ((x) > (y) ? (x) : (y));
需要注意的是,宏定义虽然提供了一种方便的代码重用和简化代码的方式,但也存在一些潜在的问题。例如,宏定义可能会导致代码可读性差、类型错误和命名冲突等问题,因此在使用宏定义时需要谨慎,并根据实际需求选择最合适的方式来实现代码复用和简化。
explicit
explicit 是 C++ 中的关键字之一,用于声明单个参数的构造函数或转换函数时,表示该构造函数或转换函数只能显式调用,不能隐式调用。
例如,以下代码定义了一个类 A,其中包含一个 int 类型的成员变量:
class A {
public:
explicit A(int n) : m_n(n) {}
private:
int m_n;
};
在上述代码中,A 类定义了一个带有一个 int 类型参数的构造函数,并将其声明为 explicit。这意味着,当使用以下语句创建 A 类对象时,
A obj = 10;
编译器会报错,因为这里使用了隐式转换,而 explicit 声明的构造函数只能显式调用。正确的写法是:
A obj(10);
需要注意的是,当一个构造函数被声明为 explicit 时,在使用该构造函数进行显式初始化时,不需要加上额外的括号或其他语法符号,可以直接使用构造函数的参数来进行初始化。例如:
A obj = A(10); // 等价于 A obj(10)
总之,explicit 关键字可以避免编译器进行隐式类型转换,从而提高代码的可读性和安全性。在设计类的接口时,如果某个单参数构造函数或类型转换函数应该被限制为显式调用,则可以使用 explicit 来进行声明。
private slots
private slots 是 Qt 中的关键字,用于声明一个私有槽函数。槽函数与普通的成员函数类似,是一种响应特定信号的函数,用于处理与信号相关的事件。槽函数可以被信号连接调用,从而执行一些特定的操作。
在 Qt 中,槽函数分为两种类型:公共槽(public slots)和私有槽(private slots)。公共槽可以被任何代码调用和连接信号,因此通常用于界面控件的操作和通信功能的实现。而私有槽只能被类内部的其它函数或代码调用,不能被连接到信号,因此通常用于实现部分内部逻辑和细节的处理。
使用 private slots 关键字可以将槽函数设置为私有的,从而限制调用者和外部代码对其的访问。例如:
class MyClass : public QObject {
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
private:
void myPrivateSlot();
private slots:
void myPrivateSlot2();
};
在上述代码中,MyClass 类定义了两个私有槽函数 myPrivateSlot() 和 myPrivateSlot2()。前者是普通的私有函数,只能由 MyClass 类内部的其它成员函数调用;后者则被声明为 private slots,既可以被 MyClass 内部的其它成员函数调用,也可以被连接到信号。不过,由于其被声明为私有槽,因此外部代码无法使用 myPrivateSlot2() 函数。
需要注意的是,使用槽函数时必须先声明 Q_OBJECT 宏,以启用 Qt 的元对象系统支持,从而能够在运行时实现信号和槽之间的连接。
打包为windows软件
因为要把写好的程序发给用户来用
源码也不是随便给别人
怎么打包和部署,把工程切换到release模式
release模式: 基本没有调试信息
debug 有很多调试信息
2 找到release模式下 编译构建的文件夹
3 改一下图标。
注意 图标格式必须为 .ico这个格式,其他不行
直接在pro文件中,写上
RC_ICONS = serial_icon.ico
把图标添加到工程目录下
4 编译后图标就变了
封包操作 需要用到qt的控制台
window菜单栏里直接搜 qt, 出现终端。
使用qt控制台。
需要在电脑桌面张创建一个新的文件夹,不能有中文路径,然后
把工程里的exe文件放到该文件夹下。
qt控制台内进入到 文件夹的路径下。
cd /d 路径
dir
执行指令
windeployqt serial.exe
使用windeployqt工具把我们新创建的exe文件自动配置
自此就有一个正常的exe可执行文件了
exe需要相应的动态依赖库才能执行
是的,通常情况下,通过编译生成的可执行文件(.exe文件)在运行时需要相应依赖的动态链接库(DLL文件)才能正常运行。
这是因为,在编译程序时,编译器将程序所依赖的外部函数和库的引用链接到可执行文件中。对于静态链接库(.lib文件),编译器将链接库的目标代码直接嵌入可执行文件中,从而使得可执行文件在运行时不再依赖该链接库;而对于动态链接库(.dll文件),编译器只将链接库的引用信息嵌入到可执行文件中,而不包含链接库的实际目标代码。因此,在运行可执行文件时需要动态加载并使用相应的动态链接库。
如果没有安装或正确配置相应的动态链接库,那么在运行可执行文件时就会出现找不到符号或无法加载 DLL 等错误,导致程序无法正常运行。为了避免这种问题,通常建议将程序所需的 DLL 文件一起打包,或者在程序运行前确保相应的 DLL 文件已经存在并设置好了可以被搜索到的路径。
在 Windows 系统中,可以使用工具如 Dependency Walker 来查看可执行文件的依赖关系,并确定程序所需的 DLL 文件。同时,也可以使用某些工具或方法来打包 DLL 文件,或在程序中动态加载和释放 DLL 文件,以提高程序的兼容性和可移植性。