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 修饰值传递的变量,修改的是拷贝,而不是本体

posted @   肆空界  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示