- 博客(62)
- 资源 (11)
- 收藏
- 关注
原创 Qt线程同步之QWaitCondition
QWaitCondition允许线程告诉其他线程某种条件已经满足。一个或多个线程可以阻塞等待QWaitCondition来使用wakeOne()或wakeAll()设置条件。使用wakeOne()唤醒一个随机选择的线程或wakeAll()唤醒所有线程。QWaitCondition同样可以使多个线程同时访问同一资源,比单纯使用互斥锁的效率更高,类似于QSemaphore。
2024-07-15 18:09:27
1041
原创 Qt线程同步之QSemaphore
QMutex,QMutexLocker,QReadWriteLocker,QReadLocker,QWriteLocker,QSemaphore,QWaitCondition信号量是互斥锁的扩展。互斥锁只能锁定一次,但信号量可以多次获取。信号量通常用于保护一定数量的相同资源。信号量具有比互斥锁更高的并发性。以生产者消费者问题举例,如果对缓冲区的访问由OMutex保护,则消费者线程不能与生产者线程同时访问缓冲区。然而让两个线程同时在缓冲区的不同部分工作并不会产生问题,使用信号量可以实现让生产者和消费者同时操
2024-07-15 17:09:00
692
原创 C++ 指针变量做参数传递时的情况分析
指针变量作为参数传递时,很容易混淆指针本身和指针指向的内容,实际应用中可能会导致无法预料的问题,所以做一下详细分析。
2024-07-12 17:46:29
742
原创 C++多态中的构造函数和析构函数
构造函数可以是虚函数吗?答:构造函数不可以是虚函数。原因:构造对象时必须知道对象的实际类型,但是虚函数调用在运行时才能确定对象的实际类型,这会导致编译器无法确定对象的具体类型。虚函数的执行依赖于虚函数表(vtable),虚函数表在构造函数中进行初始化工作,即初始化vptr(指向虚函数表的指针)。在构造对象期间,虚函数表还没有被初始化,因此无法通过虚函数表来调用构造函数。析构函数可以是虚函数吗?答:作为父类时,析构函数必须是虚函数。
2024-07-11 16:39:42
366
转载 Linux下qt使用tcmalloc
无论是在游戏开发,或者其他长期运行的服务开发中,对内存的使用一直是架构师或者主程序在最初就要关注的point,如果内存使用不当,频繁申请释放内存造成系统负担过大,性能降低,到最后产生大量内存碎片,无法申请可利用内存,最终宕机,给广大程序员同学造成长期加班的痛苦。
2024-07-10 11:47:37
61
原创 多线程场景下,使用QEventLoop使界面不卡顿的同时过滤用户输入
有耗时的操作需要放到子线程中处理,但是此过程中不允许界面执行其他操作,不能使用阻塞界面的模态对话框实现。可以通过QEventLoop在子线程执行的同时开启一个事件循环,使UI界面不卡顿,能够正常响应。但是这种不卡顿只是鼠标滑动时UI可以流畅的变化,界面没有变成卡顿状态,此时不会执行鼠标点击或者键盘输入等用户输入的事件,否则会影响子线程中正在执行的操作。
2024-07-09 19:28:57
596
原创 QProgressDialog 在进度条达到最大值时自动关闭,屏蔽esc和cancel按钮
QProgressDialog 默认会在进度达到设定的最大值时自动关闭。setAutoReset()设置为false或setAutoClose()设置为false时对话框无法自动关闭。
2024-07-09 17:41:03
321
转载 linux 判断网络是否连接正常
#define LAN_PATH "/sys/class/net/eth0/carrier" // 有线网络节点#define WLAN_PATH "/sys/class/net/wlan0/carrier" // 无线网络节点/********************************************************************* 函数名: getNetworkStatus** 函数描述: 获取当前的网络连接情况** 参数:
2022-05-10 09:15:32
2549
原创 Qt MinGW编译CyAPI源码生成静态库,使用方法及测试
1. 前言之前写了如何使用Qt mingw编译CyAPI源码生成静态库,Qt MinGW编译CyAPI源码生成静态库今天写一下使用方法和测试过程。2. 使用2.1 将准备好的静态库和头文件拷贝到工程目录下,或者放到自定义的目录下,我的目录结构:2.2 新建Qt工程,在项目文件(.pro文件)中加入以下内容:我的库和头文件都在工程目录下,所以此处配置路径如下,如果自己修改了路径直接在此处修改即可。或者右键项目添加外部静态库,选择库和头文件目录。LIBS += -L$$PWD/ -lCyAPIM
2021-11-23 16:38:49
2022
31
原创 Qt MinGW编译CyAPI源码生成静态库,支持32位,64位编译
一、前言最近需要做Windows平台 + Qt MinGW编译器做上位机与USB通信,USB芯片使用Cypress芯片。试了libusb,只能在Linux平台下使用,Windows平台用不了。所以只能使用Cypress提供的官方库CyAPI,但是Cypress官网只提供了vs版本的源码编译,在Qt下使用需要重新编译,苦于没有找到现成的资源只能自己编译,搞了一天,不过真心不难,只是没有注意细节。在此记录一下编译过程,也分享给需要的小伙伴。二、 准备需要准备好CyAPI源码,我是在官网下载的官网下载地址
2021-11-23 15:06:21
2461
7
原创 Qt pro项目文件 判断编译器版本(64 位或 32位),以及设置生成及输出文件路径
Qt pro项目文件设置greaterThan(QT_MAJOR_VERSION,4){ TARGET_ARCH=$${QT_ARCH}}else{ TARGET_ARCH=$${QMAKE_HOST.arch}}contains(TARGET_ARCH, x86_64){ CONFIG(debug,debug|release){ MOC_DIR = build/x64/tmp_debug/moc RCC_DIR = build
2021-11-23 13:56:37
4161
原创 大小端模式的判断方法
1. 大小端模式大端模式:数据的高字节存储在内存的低地址中。小端模式:数据的低字节存储在内存的低地址中。两种模式的区别就是数据在内存中是先存储高字节还是低字节,先存高字节就是大端模式,先存低字节就是小端模式。为什么会有小端字节序?答案是,计算机电路先处理低位字节,效率比较高。因为计算都是从低位开始处理,所以计算机的内部处理都是小端字节序。计算机读取数据时从低地址开始读。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。例如:3
2021-09-01 15:46:11
4449
原创 Qt信号和槽连接方式测试
Qt信号和槽的连接方式1. 常用的连接方式Qt::ConnectionType代表信号和槽的连接方式,在connect时指定。Qt::AutoConnection :缺省的默认方式,如果接收者位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连接类型在发出信号时确定。Qt::DirectConnection:当发出信号时,将立即调用槽函数。槽函数在发送信号的线程中执行。Qt::QueuedConnection:当控制权返回
2021-09-01 14:47:04
951
原创 QtStyleSheet Qt常用控件样式表查看工具
1. 前言项目需要用到样式表设置界面,但是写样式表的时候没办法即时查看效果,很不方便,所以做了一个小工具,支持实时修改样式表并即时查看样式表效果,支持几个常用的Qt控件。2. 注意事项subcontrol-origin 有 4 个值可选:marginborderpaddingcontentsubcontrol-position 水平方向有 3 个值可选:leftcenterrightsubcontrol-position 垂直方向有 3 个值可选:topcenterbot
2021-08-26 17:45:37
745
原创 Qt Model/View 自定义代理(五): 使用代理给QTableView单元格添加按钮QPushButton
Qt Model/View 自定义代理(五): 使用代理给QTableView单元格添加按钮QPushButton效果图:构造函数中传入按钮列表,即可添加多个按钮,可设置按钮样式表,使用信号槽连接按钮事件。1. 头文件#include <QObject>#include <QPushButton>#include<QStyledItemDelegate>class QMyTableViewBtnDelegate: public QStyledItemDe
2021-08-23 17:54:21
8797
15
原创 QList 和 QVector 的区别,和使用注意事项
QList 和 QVector来自Qt官方文档和Effective QtQList<T>、QLinkedList<T>和QVector<T>提供了类似的API和功能。它们通常是可互换的,但会对性能产生影响。QVector应该是默认的第一选择。 QVector<T>通常比QList<T>提供更好的性能,因为QVector<T>总是在内存中顺序存储其项,其中QList<T>在堆上分配其项,除非sizeof(T) <
2021-08-18 17:58:41
10265
原创 Qt容器类
1. 容器类概述Qt提供了多个基于模板的容器类,Qt的容器类比标准模板库(STL)中的容器类更轻巧、安全、易于使用。这些容器类是隐式共享和可重入的,它们进行了速度和存储优化,因此可以减少可执行文件的大小。此外,它们还是线程安全的,也就是说它们作为只读容器时可被多个线程访问。Qt的容器类分为顺序容器(sequential containers)和关联容器(associative containers)。容器迭代类用于遍历容器里的数据项,有Java类型的迭代类和STL类型的迭代类。Java类型的迭代类易于
2021-08-18 17:14:18
1334
转载 Qt中对文件的拷贝删除重命名等操作
1.删除指定路径的文件.//删除文件.返回一个bool值,判断是否成功删除,如果路径不存在这些,则返回false.QFile file("c:/users/administrator/desktop...");bool ok = file.remove();//因为QFile::remove()是个静态方法,可以直接调用.bool ok = QFile::remove("c:/users/administrator/desktop...");2.给指定文件重命名QFile file("c:/
2021-08-18 10:34:33
5707
原创 Qt Model/View自定义代理
QTableView使用自定义代理效果图:代码目录QTableView 自定义代理(一):基于QComboBox 的下拉框代理类QTableView自定义代理(二):基于QSpinBox的自定义代理类,输入int类型的值QTableView自定义代理(三):基于QDoubleSpinBox的自定义代理类,输入双精度double类型的值QTableView自定义代理(四):只读代理持续更新…...
2021-08-12 15:41:08
759
原创 QTableView自定义代理(四):只读代理
QTableView自定义代理(四):只读代理项目中遇到table view整体设置为双击编辑item( ui->tableView->setEditTriggers(QTableView::DoubleClicked); ),但是有些行或者列不可以编辑,这时通过只读代理设置就比较方便。tableview缺省代理是一个QLineEdit,所以只需要将创建编辑器的操作屏蔽掉就可以了。代码:class QMyReadOnlyDelegate: public QItemDelegate{
2021-08-12 15:15:29
894
原创 QTableView自定义代理(三):基于QDoubleSpinBox的自定义代理类,输入双精度double类型的值
QTableView自定义代理(三):基于QDoubleSpinBox的自定义代理类头文件#include <QStyledItemDelegate>class QMyDoubleSpinDelegate : public QStyledItemDelegate{ Q_OBJECTpublic: QMyDoubleSpinDelegate (QObject *parent=0);//自定义代理组件必须继承以下4个函数 //创建编辑组件 QWid
2021-08-12 14:49:43
636
原创 QTableView自定义代理(二):基于QSpinBox的自定义代理类,输入int类型的值
QTableView自定义代理(二):基于QSpinBox的自定义代理类
2021-08-12 14:41:36
565
原创 QTableView 自定义代理(一):基于QComboBox 的下拉框代理类
QTableView 自定义item delegate,单元格下拉框代理。
2021-08-12 14:22:27
3500
1
原创 Qt网络-UDP概述(一)
1. UDP概述UDP是轻量的、不可靠的、面向数据报的、无连接的协议,通常用于对可靠性要求不高、对速度要求较高的场合。相对于TCP通信,UDP通信不需要事先建立socket连接,UDP每次发送数据都需要指定目标地址和端口。UDP以数据报传输数据,而不是以连续的数据流。数据报大小一般小于512字节,每个数据包包含发送者和接收者的IP地址和端口等信息。2. UDP通信三种模式单播(unicast)模式:一个UDP客户端发出的数据报只发送到另一个指定IP地址和端口的UDP客户端,一对一传输。广播(bro
2021-08-06 16:58:59
602
原创 Qt网络-TCP,实现服务器、客户端传递文本消息和文件(一)
注意:本章只有概念概述,代码在下一章程序图示1. TCP概述TCP是可靠的、面向流、面向连接的传输协议,适合用于连续数据传输。TCP通信必须建立TCP连接,分为客户端和服务端。Qt提供了QTcpSocet和QTcpServer用于建立TCP通信服务。服务段需要使用QTcpServer建立端口监听,QTcpSocket用于连接建立后使用套接字socket进行通信。2. QTcpServer类常用函数void close()停止监听,关闭服务器QString errorString()
2021-08-06 15:18:58
2964
原创 Qt单例类模板,继承自QObject的类使用,方便复用,自动垃圾回收
1. Qt使用标准c++单例类模板出现的问题之前写过一篇c++单例类模板,但是那个只适用于标准c++的类。在Qt中使用时遇到了问题。我的使用场景:有些界面参数配置或者内容需要全局访问或者要在多个地方显示,但是所有地方需要保持数据的一致性,所以使用单例保证进程全局只有一个实例。但是Qt的界面类顶层都是继承自QObject的,界面一旦被设置了parent之后,对象的控制权便交给了Qt,由Qt做内存管理。界面关闭的时候,Qt会自动按照父子顺序来销毁界面实例,也就是我的单例界面实例内存被系统回收,但是地址不为空
2021-07-30 12:03:33
1993
2
原创 c++单例类模板,方便复用,自动垃圾回收
1. 单例模式单例模式的要点有三个:某个类只能有一个实例;它必须自行创建这个实例;它必须自行向整个系统提供这个实例。从具体实现角度来说,就是以下三点:单例模式的类只提供私有的构造函数,私有化拷贝构造函数和赋值操作符防止复制类定义中含有一个该类的静态私有对象该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。2. 单例需不需要释放单例模式所提供的实例是new出来的,分配在堆中,不会自动释放,需要手动释放。3. 单例类模板实现#include <mutex&g
2021-07-30 11:15:19
527
转载 总结一下Qt内存泄漏检测与处理策略
转载,原文链接:https://blog.csdn.net/libaineu2004/article/details/106771500如果时间急迫,不想看完整文章,可以直接去到文章末尾,看结论。有我个人写的C++单例类,用于内存自动释放。1、QtCreator编写C++代码,怎么检测内存泄漏?请参见本人的另一篇博文:https://blog.csdn.net/libaineu2004/article/details/1040716272、Qt中控件new之后需不需要delete的问题https:
2021-07-30 10:11:57
4715
1
原创 QList 使用注意-at(),[],value()的区别及使用场景
QList 使用注意—at(),operator[],value()的区别及使用场景以前经常使用operator[]和at(),用来查找元素的值。前几天遇到了一个问题,结构体嵌套存储了QList成员,但是无法改变QList元素的值,这才对这几个函数做了详细的了解。T QList::value(int i) const 返回指定位置i处的值如果索引i超出界限,则函数返回一个默认的构造值。如果确定索引值在边界内,则可以使用at(),at()速度稍快。返回值T,相当于返回了一个复制,使用value(i)
2021-07-27 18:02:07
9187
3
原创 QTreeView+QAbstractItemModel,自定义model,支持拖拽
Header:qmake:QT += core继承自:QObject子类:QAbstractItemModel 类定义了item model必须使用的标准接口,以便能够与model/view体系结构中的其他组件进行交互。它不应该被直接实例化,应该将其子类化以创建新模型。QAbstractItemModel 类是模型/视图类之一,是Qt的模型/视图框架的一部分。它可以用作QML中的item视图元素或Qt Widgets 模块中的item view类的基础数据模型。
2021-07-21 11:06:24
5748
翻译 Qt 拖放事件 drag drop
Qt在部件中进行拖放Qt中的拖放支持以QDrag为中心,拖放操作的大部分细节由该类处理。除了创建QDrag对象外,还需要重新实现dragMoveEvent()来接受事件和dropEvent()处理部件上的数据。最终DragEnterEvent()需要重新实现才能接受事件。在处理拖放操作的控件上,还需要调用setAcceptDrops(true);代码实现:mydialog.hclass MyDialog : public QDialog{ Q_OBJECTpublic:
2021-07-09 11:42:03
920
翻译 QTableWidget编辑单元格内容,按下回车键使焦点转到下一个单元格
编辑QTableWidget单元格内容按回车键后,使焦点从当前单元格转到下一个单元格。先上效果:方法:为了在按Enter键时使焦点从表中的一个单元格转到下一个单元格,可以重新实现代理的eventFilter(),并监听键盘事件:QEvent::KeyPress 代码实现:class MyItemDelegate : public QStyledItemDelegate{ Q_OBJECTpublic: MyItemDelegate(QObject *parent = null
2021-07-09 10:43:15
4793
4
原创 QMap常用用法
QMap的常用函数1. iterator QMap::erase(iterator pos)从映射中移除迭代器pos指向的(键、值)对,并将迭代器返回到映射中的下一项。2. int QMap::remove(const Key &key) 从映射中删除所有具有密钥的项。返回删除的项数,通常为1,但如果该键不在映射中,则返回0; 如果已将insertMulti()用于该键,则返回大于1。3. bool QMap::contains(const Key &key) const如
2021-07-08 18:01:30
5833
转载 QSS字体
css,qss font-family常用的黑体宋体等字体中英文对照当qss使用中文设置字体时,无法生效。因为qss不支持中文设置字体,所以下面给出一些常用的黑体宋体字体中英文对照。微软雅黑: Microsoft YaHei宋体:SimSun黑体:SimHei仿宋: FangSong楷体: KaiTi隶书:LiSu幼圆:YouYuan华文细黑:STXihei华文楷体:STKaiti华文宋体:STSong华文中宋:STZhongsong华文仿宋:STFangsong方正舒体:FZ
2021-06-30 09:43:27
1738
原创 银河麒麟桌面版忘记用户密码后遇到的问题以及解决过程
银河麒麟忘记用户密码解决过程解决办法重启系统,进入编辑模式修改用户密码解决步骤1. 开机等待界面按”e“进入编辑模式2. 进入编辑模式后,按键盘”↓“到底部,找到下面内容:注:上图中的”ro“处,有的同学可能是”rw“,后面会讲到。3. 按下图修改两处内容:修改ro为rw行尾添加init=/bin/bash如果”ro“处本来就是”rw“,那么可以忽略第一步。如果不修改为”rw“那么后面修改密码的时候会报错,无法成功修改密码。报错如下:passwd: Authenticati
2021-05-27 15:48:35
23193
1
QStyleSheetTool.zip
2021-08-26
qttest_drag_drop.zip
2021-07-09
QTableWidget编辑单元格内容,按下回车键使焦点转到下一个单元格
2021-07-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人