QT
文章平均质量分 68
QT
百里杨
码农想飞~~
展开
-
QTreeView使用系列教程目录
写这篇文章的目的是为了,让大家很容易上手进行QTreeView的开发,所以会先讲下原理,让大家大概明白了,再进行实操。网上很多讲QTreeView+model开发方式的文章,一上来,就是一堆代码,可能对初学者不是很好入手。介于这块知识较多,所以打算出个系列,详细讲解一下各方面的使用。1、《Qt之Model/View框架介绍》:系列教程之一2、《QTreeView+QDirModel...原创 2020-05-02 18:28:29 · 11670 阅读 · 7 评论 -
CodeEditor代码编辑器(支持行号显示)
基于QPlainTextEdit类,派生出的CodeEditor,此类更加强大,主要支持行号显示。QTextEdit和QPlainTextEdit均不支持显示行号。QPlainTextEdit类来自于QT5.14.2的官方例子,其运行效果,如下所示:下载地址:https://download.csdn.net/download/u011832525/87254187源码超级简单,容易引用,就一对类文件。原创 2022-12-07 17:04:22 · 1366 阅读 · 0 评论 -
Qt跨平台开发编程技巧总结
一、数据类型尽量使用Qt提供的数据类型,比如qint32,quint64等。typedef signed char qint8; /* 8 bit signed */typedef unsigned char quint8; /* 8 bit unsigned */typedef short qint16; /* 16 bit signed */typedef unsigned short quint16; /* 16 bit unsign原创 2020-09-26 19:06:30 · 2893 阅读 · 0 评论 -
在VS中如何生成moc文件
一、什么时候需要生成moc文件当我们在test.h中使用Q_OBJECT宏定义时,需要使用Qt提供的moc.exe将test.h编译为moc_test.cpp,当编译为moc后,一般还需要在test.cpp中末尾处,添加一句#include "moc_test.cpp"二、怎样生成moc文件利用Qt安装目录下的moc.exe,比如:D:\Qt\Qt5.13.0\5.13.0\msvc2017_64\bin\moc.exe,即可生成moc。生成命令:moc.exe test.h -o moc_tes原创 2021-06-02 18:41:51 · 7855 阅读 · 1 评论 -
在Windows下使用QMediaPlayer实现播放视频
在Windows下使用QMediaPlayer实现播放视频一、QMediaPlayer介绍二、调用QMediaPlayer实现播放视频1、实现代码2、编译运行三、程序打包注意事项1、QMediaPlayer找到解码器的原理2、部署打包目录一、QMediaPlayer介绍QMediaPlayer是Qt提供的一个跨平台媒体播放器类。该类,在Windows下时,底层基于微软的DirectShow框架实现;在Linux下时,底层基于GStreamer框架实现。也就是说,Qt没有直接使用解码库,而是对平台相关原创 2021-02-06 16:53:42 · 8847 阅读 · 2 评论 -
基于Qt的上古神器-Qt Cryptographic Architecture (QCA)加密库介绍
Qt Cryptographic Architecture是一个基于Qt的开源项目,简称QCA。该项目,使用Qt对OpenSSL进行了封装,以便向用户,提供一系列,更简单易用的加解密API。Github地址:https://github.com/highfidelity/qca可以看到,最近一次更新代码,已是7年前,想必是半截身体已入土。博主之所以,写这篇博客,目的在于,虽该项目没有继续维护,但是该项目对OpenSSL的封装,代码实现方案和思路,可能值得我们去了解学习。按照官方的说法,如下:Q原创 2021-01-26 17:58:56 · 1684 阅读 · 2 评论 -
Qt为工具栏按钮QToolButton添加下拉菜单
效果如下:主要代码如下:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); createToolButton();}void MainWindow::createToolButton(){ // 创建QToolButton QToolButton *toolButton = new原创 2021-01-26 17:23:41 · 8458 阅读 · 1 评论 -
Qt基于QuaZIP实现文件压缩/解压(Linux下)
Qt基于QuaZIP实现文件压缩/解压(Linux下)一、工具准备二、编译zlib1、下载zlib源码2、配置3、编译与安装三、编译QuaZIP1、下载QuaZIP源码2、将zlib库和头文件加入QuaZIP工程3、使用Qt Creator进行编译四、调用QuaZIP实现压缩/解压QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库。适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开。Qt中提供了qCompress原创 2021-01-19 20:34:37 · 2688 阅读 · 4 评论 -
Qt基于QuaZIP实现文件压缩/解压(Win下)
Qt基于QuaZIP实现文件压缩/解压(Win下)一、工具准备二、编译zlib1、下载zlib源码2、生成VS工程文件3、使用VS进行编译三、编译QuaZIP1、下载QuaZIP源码2、将zlib库和头文件加入QuaZIP工程3、使用Qt Creator进行编译四、调用QuaZIP实现压缩/解压QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库。适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开。Qt中提供了qC原创 2021-01-19 17:13:17 · 2690 阅读 · 4 评论 -
Qt的pro文件中路径带空格的处理办法
使用$$quote(xxx),对带空格的路径进行包围一个错误的例子如下:INCLUDEPATH += C:/Program Files/GmSSL/includeLIBS += -LC:/Program Files/GmSSL/lib -llibcrypto编译时,找不到头文件,因为路径C:/Program Files中带了空格,所以需要处理下,如下:INCLUDEPATH += $$quote(C:/Program Files/GmSSL/include)LIBS += -L$$quote(原创 2021-01-07 17:05:34 · 3349 阅读 · 2 评论 -
Windows下设置Qt程序为开机启动
本文介绍的是修改注册表方式实现开机启动程序。不要觉得修改注册表就很麻烦,NO,NO,NO。Qt中QSetting可以直接操作注册表,相当easy!一、直接看代码WinBootEnvironment.h,如下:#ifndef WINBOOTENVIRONMENT_H#define WINBOOTENVIRONMENT_H#include <QSettings>class WinBootEnvironment{public: bool enableAutostart(原创 2020-12-04 16:26:16 · 1094 阅读 · 0 评论 -
QThreadPool线程池的原理与使用
一、为什么需要用线程池现在所有的高性能服务器程序,几乎都会使用到线程池技术,从而更好且有效的榨干服务器性能。1、开多少个线程可以达到性能最佳不知道,你有没有这个疑问? 这是一种常见的线程使用方式:class MyThread: public QThread{public: virtual void run() override { // ... }};MyThread th;th.start();线程的创建和销毁是有性能开销的,当我们有少量业务需原创 2020-11-05 18:24:06 · 6481 阅读 · 1 评论 -
Qt拼接文件路径方式总结
一、使用字符串拼接QString filePath = QCoreApplication::applicationDirPath() + "/test/temp.dat";建议尽量使用"/"符号,这样路径跨平台也是正确的。而不要使用win下的"\",这样在linux平台下,路径不正确。二、使用现有函数更方便已知目录和文件名,拼接该文件的绝对路径QDir dir("C:/Test");QString filePath = dir.absoluteFilePath("temp.dat"); //原创 2020-10-23 18:21:09 · 8216 阅读 · 0 评论 -
C、C++、Qt类型转换总结
一、C类型转换转换格式如下:Type b = (Type)a二、C++类型转换1、const_cast去掉类型的const或volatile属性。const int a = 10;a = 20; // compile errorint& b = const_cast<int&>(a);b = 20; // compile ok,a==20,b==20int a = 10;const int *p = &a;*p = 20;原创 2020-08-29 15:54:54 · 2103 阅读 · 0 评论 -
Qt属性与反射实现多个不同类型对象的保存与加载
本文针对如下需求场景,提出一种解决方案。一、需求场景我们的需求如下:我们程序需要运行多个算法,每个算法执行不同的处理,并且算法有各自的参数,这些参数也是不同的。同时提供界面,可以对需要运行的算法进行选择,每个算法的参数值可以编辑。选择好的算法,以及编辑好的参数需要保存为配置文件,下次启动时,自动载入至界面。二、设计实现1、解决第1条需求首先,因为多个算法需要被运行,我们很容易想到抽象出一个IAlgo接口类,如下:class IAlgo{public: virtual原创 2020-08-29 12:16:14 · 1602 阅读 · 4 评论 -
win和linux下如何给Qt应用程序添加图标
一、没有设置应用程序图标时如下,标题栏:任务栏:文件图标:二、设置应用程序图标1、准备一张ico图标图标文件名为:shehui.ico2、创建res.rc文件内容为:IDI_ICON1 ICON DISCARDABLE "shehui.ico"3、修改pro文件在pro中加入如下内容:RC_FILE += res.rc重新编译,生成exe。效果如下: ==================================================原创 2020-08-22 14:10:58 · 5021 阅读 · 2 评论 -
关于Qt路径中带空格或者中文的问题
对于Qt是否不支持路径中空格或中文的疑虑,可以打消了。可以肯定的是,Qt支持任意带空格和中文的路径。一、测试代码QtCreator+MSVC编译器环境下,测试代码如下:void testWriteFile(const QString& fileName){ QFile file(fileName); if (file.open(QIODevice::WriteOnly)) { file.write("123"); } else原创 2020-08-22 14:00:58 · 5780 阅读 · 0 评论 -
给Qt程序添加管理员权限总结(一定有你没见过的方式)
当我们写了一个Qt程序,程序会在C盘某些目录下创建文件时,会发现代码没有问题,但是就是创建失败。而当我们对程序右键,以管理员权限运行时,又可以正常创建文件。此时,说明我们的程序默认不具备管理员权限,故而无法对某些目录进行写入。根据我们的编译器不同,有如下2种情况。一、使用MSVC编译器在pro文件中,添加如下一行:QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"重新编译之后,程序原创 2020-08-22 11:57:03 · 15195 阅读 · 16 评论 -
Qt属性系统详细使用教程
何为属性?人有名字,年龄,性别,这就是人的属性。同样,面向对象编程的世界里,一切皆对象,对象也该有自己特定的属性。在Qt中,QObject实现了对于属性的支持,那么派生于QObject的对象,都可以很容易的拥有自己的属性。注:使用Qt属性,则必须继承于QObject一、属性的声明让我们看看帮助文档中关于属性声明的定义:Q_PROPERTY(type name (READ getFunction [WRITE setFunction] | MEMBER原创 2020-06-21 20:55:25 · 4212 阅读 · 0 评论 -
基于Qt事件发布与订阅框架QuickEvent使用
近段时间,在网上无意间发现一个网友写的关于事件发布与订阅库。这个框架,名叫QuickEvent,git地址:https://gitee.com/fmldd/Quick-Event大家知道关于Qt如何自定义事件,如果不清楚请参考《Qt中的事件(3)- 自定义事件》。QuickEvent就是基于此基本原理实现的。代码量比较少,只有几百行。目前只能说勉强能用吧,也存在一些问题。当然你也可以基于这个代码,造自己的轮子。开一篇博客,记录下使用,待到要实际使用时,拎过来用就ok。一、发布与订阅扫盲何为发布、原创 2020-06-20 17:49:33 · 4790 阅读 · 9 评论 -
Qt轻量级日志库QsLog的使用
C加加下的日志库有很多,如log4cpp、Easylogging++等,Qt下也有log4qt。不过我们今天要说的是QsLog,它是一个基于Qt的轻量级开源日志库。git地址:https://github.com/victronenergy/QsLog轻到什么程度,请看如下:代码文件就是这么点。花点时间阅读一下,秒改造成你自己的私有轮子。虽然轻量级,但是对于基本的日志功能需求还是够用的。特征六个日志级别(从跟踪到致命)运行时可配置的日志级别阈值。关闭日志记录时的最小开销。支持多个目标原创 2020-06-13 19:16:35 · 13744 阅读 · 10 评论 -
通用属性对象PropertyObject,支持所有属性导出
一、通用属性对象类这是以前造的一个废轮子,不过需求改变,不用了,代码写好了,也不能浪费,发出来。思路可以复用。如何将一个对象的所有属性导出为QString,并支持不同对象的层次组合。定义一个通用的属性对象类,如下:PropertyObject.h#ifndef PROPERTYOBJECT_H#define PROPERTYOBJECT_H#include <QObject>#include <QVariant>#include <QDataStream&g原创 2020-05-24 19:13:57 · 1039 阅读 · 2 评论 -
实现TextListWidget控件(带删除按钮)
一、运行效果实现文本列表框控件,先看效果,不耽误大家时间,有需要自取。二、实现思路继承QListWidget,然后使用setItemWidget方法,为每个item指定一个widget。void setItemWidget(QListWidgetItem *item, QWidget *widget);并在每个widget中添加一个删除按钮,信号连接到删除item处理逻辑。三、控件代码我们先实现item对应的widget类TextItemWidgetTextItemWidget.h#i原创 2020-05-24 18:29:49 · 1027 阅读 · 3 评论 -
有容乃大的QVariant之使用
一、简述QVariant,是Qt中的一个变量类,属于Qt的底层核心之一,很多模块都是基于此类。可以支持N多的类型,具体支持多少,请看其类中定义的枚举:enum Type { Invalid = QMetaType::UnknownType, Bool = QMetaType::Bool, Int = QMetaType::Int, UInt = QMetaType::UInt, LongLong = QMetaType::LongLong, ULongLo原创 2020-05-24 17:51:15 · 2788 阅读 · 0 评论 -
QVariant与自定义类型互转之奇巧淫技
QVariant原本就支持了很多的类型,如int、double、QString、QSize等。那么,如何让QVariant支持自定义类型。只需使用一条Q_DECLARE_METATYPE,将类型定义为元数据类型,即可。struct Student{ QString name; int age;};Q_DECLARE_METATYPE(Student)自定义类型与QVariant互转Student stu1;stu1.name = "hh";stu1.age = 10;原创 2020-05-24 14:53:54 · 4804 阅读 · 2 评论 -
QThread之重写run() 实现线程与业务解耦
一、线程的一般实现形式Qt中线程类QThread有2种使用方式。1.继承自QThread,重写run() class MyThread : public QThread { Q_OBJECT protected: virtual void run() override { ... } };我们一般在run()中加个死循环,不停处理业务或者调用相关的方法。这样的话,我们的业务逻辑与线程紧密耦合在一起。适用场景:用于一直不停处理业务,而不是处理完一单业务后,就可以休眠的这原创 2020-05-24 13:39:19 · 2003 阅读 · 0 评论 -
QThread之moveToThread用法
一、怎么用使用一个QObject作为Worker,并moveToThread到线程上,那么这个QObject生存在此线程上,其信号会在此线程上发射,其槽函数在此线程上执行。意味着什么,意味着多线程操作时,若通过信号槽方式,则无需关心数据线程安全性,无需加锁解锁。语言总是晦涩的,直接看以下烂大街的代码吧。Worker.hclass Worker : public QObject{ Q_OBJECTpublic: explicit Worker(QObject *parent =原创 2020-05-24 13:34:49 · 26955 阅读 · 15 评论 -
QThread如何优雅实现暂停(挂起)功能
一、实现思路QThread中有start、quit,但是没有pause,那么我们想要实现这个功能。我们继承QThread,重写run();第一反应是不是应该添加个标志,在run()中判断暂停状态。嗯,没错,不过我们不能用普通变量,否则有线程非安全风险。这里使用C++提供的原子类型std::atomic_bool。线程暂停期间,不能空跑消耗cpu,故我们使用Qt条件变量QWaitCondition,配合QMutex。大概就是这么点内容吧,实现代码如下:Thread.h#include <原创 2020-05-23 22:44:09 · 13817 阅读 · 19 评论 -
关于Qt实现类反射的一些思考与总结
一、Qt怎么实现反射实例化的?这里有2种办法,参考:《Qt通过类名称创建类的实例的两种方法》第一种,注册元数据类型,通过类型id实例化class Animal { public: virtual void voice();}class Dog : public Animal{ public: virtual void voice();};// 注册类型qRegisterMetaType<Dog>("Dog");// 实例化int id = QMet原创 2020-05-23 21:56:43 · 2153 阅读 · 3 评论 -
《QTreeView实现行列的插入与删除》:系列教程之十一
一、概述QTreeView行列的插入与删除,若使用QTreeView+QStandardItemModel方式,或者QTreeWidget方式实现的话,直接调用相应的方法就行了。而采用QTreeView+自定义model方式的话,需要我们自己实现数据的插入与删除,故在本节中,我们主要对此方式进行说明。前面已经对如何实现自定义model,进行了说明,所以对这部分不再赘述。行与列的插入或删除,比较类似,所以我们只对行操作进行说明,列操作可参考行操作实现。二、实现插入行我们重写QAbstractItem原创 2020-05-17 20:24:45 · 11478 阅读 · 0 评论 -
《使用QSortFilterProxyModel实现QTreeView行列过滤》:系列教程之十
一、QSortFilterProxyModel简介QSortFilterProxyModel的使用比较简单,我们在上一章,使用它来实现排序时,已经大概使用过了。本章我们主要使用它实现对QTreeView中行列的筛选过滤。它是一个model代理类,需要配合原始数据model使用。我们先来看看QSortFilterProxyModel的设置过滤器函数,如下:void setFilterRegExp(const QRegExp ®Exp);参数QRegExp正则表达式类,其构造函数,包括p原创 2020-05-17 15:47:45 · 7377 阅读 · 5 评论 -
《QTreeView表项实现排序的2种方式》:系列教程之九
一、综述基于QT的Model/View框架,我们可以自定义model实现数据与View分离。让数据实现排序的方式有2种:在QAbstractItemModel子类中重新实现sort()函数;在QSortFilterProxyModel代理model子类中重新实现lessThan()函数,并用该子类代理model来包装原始model。接下来,我们还是在之前自定义model的,代码基础上进行说明。二、重写QAbstractItemModel的sort()实现排序在QAbstractItemMo原创 2020-05-16 16:31:44 · 5782 阅读 · 1 评论 -
《QTreeView中嵌入QPushButton实现命令操作》:系列教程之八(第8小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView中嵌入QPushButton实现命令操作。本小节比之前要稍微麻烦一些,之前我们都是嵌入的被动显示的控件,而QPushButton...原创 2020-05-05 22:50:56 · 5420 阅读 · 16 评论 -
《QTreeView中嵌入QDateTimeEdit实现编辑日期时间》:系列教程之八(第7小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView中嵌入QDateTimeEdit实现编辑日期时间。从委托类QItemDelegate继承,createEditor()创建Ed...原创 2020-05-05 22:47:06 · 1028 阅读 · 0 评论 -
《QTreeView中嵌入QPixmap图标以展示状态数据》:系列教程之八(第6小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView中嵌入QPixmap图标以展示状态数据。从委托类QItemDelegate继承,由于我们需要QPixmap图标一直显示,而不是双...原创 2020-05-05 22:44:56 · 1412 阅读 · 0 评论 -
《QTreeView中嵌入QProgressBar以展示进度数据》:系列教程之八(第5小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView中嵌入QProgressBar以展示进度数据。从委托类QItemDelegate继承,由于我们需要QProgressBar一直显...原创 2020-05-05 22:42:50 · 1968 阅读 · 2 评论 -
《QTreeView中嵌入QComboBox实现选择数据》:系列教程之八(第4小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView中嵌入QComboBox实现选择数据。从委托类QItemDelegate继承,createEditor()创建Editor并返...原创 2020-05-05 22:40:28 · 4101 阅读 · 7 评论 -
《QTreeView中嵌入QSpinBox实现编辑数据》:系列教程之八(第3小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView中嵌入QSpinBox实现编辑数据。从委托类QItemDelegate继承,createEditor()创建Editor并返回...原创 2020-05-05 22:38:04 · 1343 阅读 · 0 评论 -
《QTreeView中嵌入QLineEdit实现编辑数据》:系列教程之八(第2小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView中嵌入QLineEdit实现编辑数据。从委托类QItemDelegate继承,createEditor()创建Editor并返...原创 2020-05-05 22:36:06 · 3071 阅读 · 3 评论 -
《QTreeView实现某列元素只读》:系列教程之八(第1小节)
本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。接下来开始讲解,QTreeView实现某列元素只读。从委托类QItemDelegate继承,在createEditor中直接返回nullptr即可。class ...原创 2020-05-05 22:33:08 · 1845 阅读 · 0 评论