Qt基础
-
qtWidget(空窗口)
-
QT简介
-
跨平台,接口简单,一定程度简化了内存回收
-
版本:商业版,开源版
-
案例
-
Linux桌面KDE
-
谷歌地图
-
VLC多媒体播放器
-
-
-
基类关系
-
程序介绍
-
main文件
-
QApplication a;//应用程序对象,只有一个
-
myWidget w;//窗口对象,默认不会显示,需要调用show方法
-
return a.exec();//让应用程序对象进入消息循环,让代码阻塞到这里
-
-
.pro文件
-
QT+=core gui//qt包含的模块
-
qt的模块
-
-
greaterThan(QT_NAJOR_VERSION,4);QT+=wiggets//大于4版本以上 包含widget模块
-
TARGET=可执行程序的名字
-
TEMPLATE=app//模板 应用程序模板
-
SOURCES+=main.cpp\ mywidget.cpp //源文件
-
HEADERS+=myWidget.h //头文件
-
-
头文件
-
QWidget//窗口类头文件
-
Q_OBJECT//宏,允许使用信号和曹的机制
-
-
-
快捷键
-
ctrl+/ //注释 ;ctrl+r //运行 ;ctrl+b//编译; ctrl+f //查找 ;ctrl+shift+上箭头;f1//帮助文档;ctrl+i自动对齐;。h和。cpp快速切换f4;
-
-
对象树
-
-
当创建的对象在堆区的时候,如果指定的父亲是QObject的派生类,那么可以不用管理释放的操作,会自动将对象放入对象树中,一定程度上简化了内存回收机制
-
-
QT的窗口坐标系
-
左上角为原点
-
-
信号和槽
-
connect(信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽(函数)))
-
-
一,Qt connect 函数原型如下,第五个(5种)参数根据接收者和发送者是否在同一个线程不同
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
二,Qt::ConnectionType 详解
Qt::AutoConnection
默认值,使用此值,连接类型会在信号发射时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型,如果接收者和发送者不在同一个线程,则自动使 用Qt::QueuedConnection类型。
Qt::DirectConnection
槽函数运行于信号发送者所在的线程,效果上就像是直接在信号发送的位置调用了槽函数。多线程下比较危险,可能会造成崩溃。
Qt::QueuedConnection
槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号后,槽函数不会立即被调用,等到接收者当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程下用这个类型。
Qt::BlockingQueuedConnection
槽函数的调用时机与Qt::QueuedConnection 一致,不过在发送完信号后,发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则会死锁。在多线程间需要同步的场合会用到这个。
Qt::UniqueConnection
此类型可通过 “|” 与以上四个结合在一起使用。此类型为当某个信号和槽已经连接时,在进行重复连接时就会失败,可避免重复连接。如果重复连接,槽函数会重复执行。
-
-
-
信号槽的优点
-
松散耦合:信号的发送端和接受端本身没有关联,通过connect连接将两端耦合在一起
-
-
自定义信号和槽
-
信号
-
返回void
-
需要声明,不需要实现
-
可以有参数,可以重载
-
-
槽函数
-
返回void
-
需要声明,需要实现
-
可以有参数,可以重载
-
写到public slot下或者public或者全局函数
-
-
触发自定义信号
-
emit 自定义信号
-
-
-
信号可以连接信号
-
一个信号可以连接多个槽
-
多个信号可以连接一个槽
-
信号和槽的参数类型必须一一对应
-
信号的参数个数可以多余槽的参数个数,类型从前往后对应
-
-
Qt4版本以前的信号和槽连接方式
-
无参版本
-
connect(zt,SIGNAL(hungry()),st,SLOT(treat()));
-
底层:SIGNAL("hungry"),SLOT("treat")
-
-
qt5以上版本支持qt4写法
-
-
-
qMainWindow
-
部件
-
所有枚举值
-
Qt::~
-
-
资源文件
-
1将图片文件放到项目位置下
-
2右键项目-》添加新文件-》Qt->Qt resource File ->给文件起名
-
res 生成res.qrc
-
open in edit 编辑资源
-
添加前缀 添加文件
-
使用 “:+前缀名+文件名”
-
-
对话框
-
模态
-
不可以对其他窗口操作
-
exec()
-
-
-
非模态
-
.show(),为防止一闪而过,创建到堆区,同时防止内存泄漏,设置属性
-
-
-
界面ui
-
布局
-
控件
-
按钮组
-
QlistWidget 列表容器
-
-
-
-
高级
-
自定义封装控件
-
添加新文件--Qt-设计师界面类
-
.ui中设计QSpin和QSlider两个控件
-
Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升
-
实现功能,通过信号槽监听
-
提供getNum函数和setBun函数
-
-
鼠标事件
-
鼠标进入事件
-
enterEvent
-
-
离开,按下,释放,移动
-
-
定时器
-
1
-
利用事件
-
void timerEvent(QTimeEvent* ev);
-
-
启动定时器
-
startTimer(1000)
-
-
timerEvent的返回值是定时器的唯一标识,可以和ev->timerId做比较
-
-
2
-
利用定时器类QTimer
-
创建定时器类QTimer* timer=new QTimer(this);
-
启动定时器timer->start(毫秒)
-
每隔一定毫秒,发送信号,timeout,进行监听
-
暂停timer-<stop
-
-
-
Event事件分发器
-
cvent
-
用图:用于事件的分发
-
bool event(QEvent*e)
-
返回值,如果是true,代表用户处理这个事件,不向下分发
-
e->type()==鼠标按下
-
-
-
-
事件过滤器
-
在程序将事件分发到事件分发器前,可以利用过滤器做拦截
-
步骤
-
1给控件安装事件过滤器
-
2重写eventfilter事件
-
-
-
-
QPainter绘图
-
绘图事件
-
void paintRvent()
-
-
声明一个画家对象
-
QPainter painter(this)
-
-
设置画笔
-
设置画刷
-
-
QPainter高级绘图
-
抗锯齿 效率低
-
painter.setRenderHint(QPainter::Antialiasing);
-
-
对画家进行移动
-
painter.translate(100,0);
-
保存状态
-
save
-
-
还原状态
-
restore
-
-
-
-
手动调用绘图事件
-
如果想要手动调用绘图事件,利用update
-
如果画家画图片
-
painter,drawPixmap(x,y,QPixmap())
-
-
-
绘图设备
-
指继承QPainterDevice的子类
-
QPixmap,QBitmap(黑白色),QImage,QPicture,QWidget
-
-
QPixmap
-
对不同平台做了显示的优化
-
pix.fill(填充颜色)
-
QPainter painter(& pix)
-
-
QImage
-
可以对像素进行访问
-
img.setPixel(i,j,value)
-
-
-
Qpicture
-
记录和重现 绘图指令
-
QPicture pic
-
painter.begin(&pic)
-
保存
-
pic.save(任意后缀名)
-
-
重现
-
painter.drawPicture(0,0,pic)
-
-
-
-
QFile文件读写
-
QFile进行读写操作
-
QFile file(path 文件路径)
-
file.open(打开方式) QIODevice::readOnly
-
file.readAll() file.readLine() atend()判断 默认支持utf-8 file.write()
-
编码格式类对象 QTextCodec *codec=QTextCodec::codecForName("gbk"); codex->toUnicode(array)
-
文件对象关闭
-
-
QFileInfo文件信息
-
QFileInfo info(文件路径)
-
info.+各种函数 获取文件相关信息
-
-
-
tips
-
QString->char*=====>先转成QByteArray(通过.toUtf8())再转char*(通过.data())
-
格式化字符串
-
QString("%1 %2").arg(111).arg(222)
-
-
lambda表达式
-
mutable 修饰值传递的变量,修改的是拷贝,而不是本体
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下