自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

“时光清浅,不觉多年”的博客

记录所学、所遇、所思

  • 博客(148)
  • 收藏
  • 关注

原创 Qt传递自定义类型时槽函数不响应的原因及解决方案

因项目需要,在线程中进行数据解析结束之后,需要将处理后的数据值通过信号的方式传递出来。这个值是一个自定义的类型,里面定义了解析之后的格式。typedef struct test_type{ //......}TEST_TYPE;然后就是连接信号槽了,如下:connect(pThread, SIGNAL(dataResult(TEST_TYPE)), this, SLOT(onDataResult(TEST_TYPE)));然后发现槽函数死活进不去,在查阅资料之后,找到了两种解决方法:

2021-09-03 10:36:03 4780

原创 关于QThread在设置parent之后,在程序关闭的时候出错问题的分析及解决方法

现象因项目需要,写了一个继承自QThread的线程类用于处理数据信息。在给继承的线程类添加了父对象之后,程序可以正常执行,但是在关闭的时候报了如下的错误:添加父对象的伪代码如下:MyThread *pThread = new MyThread(this);pThread->start();原因分析借着报错信息,提示了Destroyed while thread is still running,直译过来就是在线程仍然运行的情况下,把它摧毁了。也就是说线程还在跑的情况下,执行了其析构

2021-09-03 09:34:46 657

原创 QCheckBox使用时候的一个注意点

项目中需要使用一个QCheckBox来控制某些界面的显隐,并且在不满足条件的情况下,需要将CheckBox的值恢复到原先的状态。如CheckBox本身控制着远端设备的启停,从unchecked状态点击,按理说会启动设备,并将CheckBox状态变为checked。但是如果在启动的过程中失败了,这个时候需要恢复CheckBox的状态。这就是项目的需求。为了实现状态的恢复,特意设计了一个recover函数,最开始的一版使用的是setChecked()函数,如下:void recoverState(boo

2021-09-01 17:36:45 1621 1

原创 构造函数不支持多态

今天在写项目的时候,需要使用到多态的效果,因此就设计了三个类,一个基类,一个派生类,外加一个派生类中需要使用到的界面类。大体结构如下:///< 基类 >// 头文件#pragma once#include <QtWidgets/QMainWindow>#include "ui_wgttest.h"class QTabWidget;class WgtTest : public QMainWindow{ Q_OBJECTpublic: Wgt

2021-08-28 09:16:01 267

原创 QTreeWidget的右键菜单实现

前言因为QTreeWidget有明确的父子关系,这个特点使得其可以有着明确的分级关系,对于具有明显从属关系的节点的控制是非常好的。但是也是由于这个特点,导致如果需要对其进行右键菜单的分级别展示(不同层级的节点具有不同的右键菜单)会有一定的困难。鉴于此,特意整理了一下对于这个问题的处理方式,具体的逻辑可分为两种:重写QTreeWidgetItem的方式 —— 通过dynamic_cast来确认级别(也可通过设置type的方式)设置type的方式 —— 通过type来确定级别对于不需要特殊存储的

2021-08-26 10:28:35 3492

原创 C++和Qt的方式判断IP地址是否合法

在接触的项目中,遇到了需要判断IP地址是否合法的需求,用纯C++和Qt的方式,分别写了一种,如下所示。Qt的方式:bool ipAddrIsOK(const QString & ip){ if (ip.isEmpty()) { return false; } QStringList list = ip.split('.'); if (list.size() != 4) { return false; } for (const auto& num : list

2021-08-12 11:47:01 2246 1

原创 VS中bool值为true(205)的解决方法

今天在调试代码的时候,发现一个bool值判断式的返回值一直有问题,明明两个值都是true,但是判断的返回值却是false,一直进不了期望的分支。if (m_active == active){ // do sth.}else{ // do sth.}后面打断点跟踪,发现其中一个值为true(205),另一个值是true,没有下标,如下图所示:这让我很困惑,查了资料之后发现,这与VS本身的初始化值有关系:当一个函数的参数返回值是bool的时候,如果将这个函数表达式直接作为参数传递给

2021-08-10 18:22:25 1010

原创 VS控制台中文显示乱码的一种解决方法

VS控制台默认的是GBK编码,如下图所示,对于UTF-8格式的中文展示不友好,一直显示乱码。而我的文件基本都是按照UTF-8的格式进行编码的,然后读取的数据也是这种格式,如果仅仅是进行展示,其实可以通过改变控制台编码的方式来更改显示,如下:#include <iostream>#include "Windows.h"int main(int argc, char* argv[]){ // 更改控制台输出编码 —— 65001表示UTF-8编码格式 SetConsoleOutpu

2021-08-09 11:57:07 2325 1

原创 使用C++进行字符串转数字注意点

为了操作方便起见,我在项目中使用到的转换函数是C++中string自带的诸如stoi等的转换函数,而不是C风格的ctoi等方法,但是使用这些方法需要几个注意点:1. 字符串不能为空;2. 字符串中不能有特殊字符。这两点对于字符串转为数字而言非常重要,这也就对代码提出了一些要求:1. 转换之前先判空;2. 判断是否有特殊字符。鉴于此,特意写了一个判断函数,源码如下:bool strIsOK(const std::string & rawData) const{ auto iter =

2021-08-09 11:43:14 251

原创 更改浮点型数据显示小数位数的方法

因工作需要,需要将float类型的数据通过字符串的方式进行展示。在使用to_string()函数进行转换的过程中,出现了一点问题,因为精度丢失的问题,某些情况下数据的展示不正常,例如某个数据位-180,但是在通过to_string()进行转换之后,就变成了如下图所示的样子:鉴于此,在查阅了相关的资料之后,将相关的解决方法展示如下。方法一:使用"setprecision"+"字符流"的方式在查阅资料的过程中,首先映入眼帘的是就是通过C++中的setprecision的方式修改显示的精度。但是查阅到

2021-07-09 18:12:08 2033

原创 如何防止数据库中的表格被重复创建

对于一个项目而言,对于一个数据库的使用不会是单次的,如果数据库的创建操作是在软件启动的时候完成的,那么如何保证数据库中的表格不会被重复创建呢?以下提供两种思路。1. CREATE TABLE IF NOT EXISTS table_name第一种方式就是通过添加 IF NOT EXISTS 限定词来确保只有在表格不存在的情况下才会创建。CREATE TABLE IF NOT EXISTS student_info( id INT NOT NULL AUTO_INCREMENT PRIM

2021-06-17 18:01:24 1594

原创 Qt的数据库事务

事务的最大的功能就是保证数据库操作的原子性。启动事务之后,如果没有异常,则可以正常提交;如果操作过程中有任何的异常,则回滚至开始的状态。Qt的数据库事务操作示例代码如下(仅做演示用,没有进行相应的判断功能):#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlError>#include <QMessageBox>#include <QSqlDriver>#includ

2021-06-17 11:51:14 1065

原创 QLineEdit的焦点事件

文章目录前言焦点事件QLineEdit焦点事件测试使用事件过滤器的方式重写QLineEdit的方式操作系统对于焦点事件的影响结论前言在项目中,遇到了在通过焦点事件调用系统输入法显示异常的情况,后来发现问题发生在焦点事件上,在调用输入法以及关闭输入法的时候出现了焦点的转移,这就导致输入法一直被调用。就特意研究了一下Qt的焦点事件,以及通过QLineEdit进行一些测试操作。焦点事件在应用程序中,都会有一个当前窗口,即当前获得焦点事件的窗口,这个窗口可以接受键盘的输入。焦点事件分为FocusIn和F

2021-05-31 10:53:01 8052

原创 教训:接收缓冲区一定要记得清空

有一个需求是需要程序获得本机的ip配置,因此采用的方式是通过C++代码调用ipconfig的方式获得。在网上查阅了相关的资料之后,最终选择采用调用CreateProcess的方式获取。部分代码如下:string getIpconfigCommandResult(){ string command("ipconfig"); unsigned len = command.size() * 2; setlocale(LC_CTYPE, ""); wchar_t *p = new wchar_t[l

2021-05-19 14:30:29 503

原创 正则表达式简述

注:本文仅用于介绍正则表达式中的基本概念和语法。正则表达式:Regular Expression所以在Qt中如果想要使用正则表达式,需要包含头文件QRegExp,在C++中使用正则表达式的话,需要包含的头文件是regex。正则表达式,顾名思义,是一种符合正确规则的表达式,里面重要的点在于 “正确” ,也就是符合期望,它是一种字符串匹配的模式。1. 表现形式正则表达式的表现形式是一串字符串,在这串字符串中包含了我们希望能够正确匹配的规则。2. 字符分类字符分为两类:普通字符、特殊字符(元字符)

2021-05-14 15:35:59 221

原创 C++中使用lua脚本

还是因为项目的原因,需要在C++中使用到lua脚本,使用到的就是普通的lua库,可以在这里下载。1. 项目中导入lua模块创建工程后,在项目中导入lua模块,一个是lua的头文件,还有就是lua的lib库关于lib库,比较简单的使用方式就是直接使用这个以-static结尾的静态库即可,比较方便,无需其他操作。2. 使用先创建一个lua脚本,比较简单,就定义了一个字符串、一个表格、两个函数(一个有参,一个无参)。如下:mystr = "I'm lua"myTable = {name = "

2021-04-22 19:51:53 4996 3

原创 笔记:关于QMap使用时候的一点技巧

这篇博客纯粹是笔记,非技术类探讨,用于记录一下我在使用QMap的时候发现的一个小技巧。今天设计界面的时候遇到一个现象,就是对于界面上的某些控件(如button)而言,在没有找到对应的数据的时候,需要显示一个默认的值(比如显示“请选择)。因为采用的容器是QMap,因此在获得某个值之前需要先找一下看看这个数据是否存在在QMap容器中,如果存在就直接将数据拿出展示,如果没有,就显示为默认值。示例代码如下:QMap<int, QString> testNamesMap;......ui.te

2021-04-21 15:37:15 1076 3

原创 使用QButtonGroup时如何做到消除全部选中项

在使用QButtonGroup的时候,为了做到只有一个被选中,因此使用到了:m_btnsBtnGroup->setExclusive(true);这一个有一个比较大的问题,但是在有一个被选中了之后,就无法恢复到全部未选中的状态,就一直会处于有且一个被选中的状态。但是有的时候需要恢复到未选中的状态,此时可以采用添加一个隐藏的按钮然后将之选中的方法,做到其他按钮看起来是没有被选中的状态。示例代码:///< 设置隐藏按钮m_pCleanBtn->setVisible(false);

2021-04-20 20:54:11 3066 3

原创 使用socket进行网络通信时候的注意点(内存分配即初始化的方式控制库的加载和卸载)

以使用socket进行UDP通信为例,在通信开始和结束的时候,分别会调用库函数加载和卸载的操作,一般情况下,比较简略的代码是直接在调用数据通信之前加载库,以及在结束通信之后卸载库,也就是调用WSaStartup和WSACleanup函数。WSAStartup:通知操作系统,启用SOCKET的DLL库WSACleanup:WSACleanup()是一个计算机函数,功能是终止Winsock 2 DLL (Ws2_32.dll)的使用,函数原型是int PASCAL FAR WSACleanup (v

2021-04-16 15:18:20 267

原创 C++实现字符串去掉前后的空格

今天遇到一个需求,需要去除字符串前后的空格,因为std::string本身没有去除空格的函数,因此自己写了一个,如下:string trimmed(const string & data){ int lPos = data.find_first_not_of(' '); int rPos = data.find_last_not_of(' '); return data.substr(lPos, rPos - lPos + 1);}比较简单,仅仅是记录一下。...

2021-04-14 10:18:13 1319

原创 C++中使用MySQL数据库

文章目录1. 安装MySQL2. 拷贝include和lib文件夹到C++工程中3. 正式使用数据库3.1 范例3.2 类介绍3.2.1 MYSQL句柄类3.2.2 MYSQL_RES查询结果集3.2.3 MYSQL_ROW获取单行内容3.3 重要接口函数介绍3.3.1 连接数据库3.3.2 查询3.3.3 获取查询结果集3.3.4 读取结果集数据4. 结果演示参考链接因为项目需要使用C++的方式调用MySQL数据库,因为以前使用的都是Qt的数据库类,因此在网上查阅相关资料后,特整理一下使用方法。(下方的

2021-04-09 10:29:45 20376 6

原创 C++中使用json

文章目录1. 项目中导入rapidjson模块2. 使用2.1 写json数据2.2 读json3. 总结参考链接因为项目的原因,需要在代码中读写json格式的数据。又因为不是采用的Qt,所以不能直接使用Qt的json读写,因此选择了第三方库rapidjson。关于json的语法,可以查阅我的另一篇博客json介绍及使用QJson操作json格式数据,这里面对于json的语法以及Qt对于json格式数据的操作进行了比较详细的介绍。rapidjson仅仅是生成/解析json格式的数据,并不涉及到具体的文

2021-04-07 13:56:04 6430

原创 Qt中界面与界面的通信方式

Qt中经常会碰到界面和界面之间的通信,借着这个机会,就将常见的几种方式总结一下。常用的方式:信号和槽全局变量文件静态函数 + 仿单例以下就详细介绍一下。1. 信号和槽信号和槽可以说是Qt的精髓了,其本质实际上就是回调函数,具体的使用其实比较简单,只要能找到对应窗口的句柄,以及其发射的信号,或者是接收的槽,就可以实现界面与界面之间的通信。因为比较简单,这里就不多加赘述。2. 全局变量对于全局变量,本人是又爱又恨。在恰当使用全局变量的时候,可以实现代码量的大量简化,这是我喜欢它的点。

2021-04-02 09:53:04 1320 2

原创 C++代码中调用Python处理脚本的方式

文章目录前言(背景介绍)一:环境配置1. 安装Python2. 创建C++项目3. 拷贝文件夹4. 在VS中配置Python内容5. 将py文件拷贝到可执行程序目录下二:代码中调用py文件1. 初始化2. 导入python脚本模块3. 函数调用3.1 无参函数调用3.2 有参函数调用4. 结果演示参考链接前言(背景介绍)因为项目中需要使用到Python脚本,而主代码是用C++书写的,因此需要实现C++调用Python。因为此篇文章主要起测试连接作用,因此使用比较简单,下方为Python脚本内容:#

2021-03-30 16:20:51 1327 3

原创 Python中创建十六进制数组的方式

项目中使用到Python脚本进行边缘计算,其中有一个需求在测试的时候需要使用到十六进制的数据,在查阅资料之后决定使用bytearray的fromhex函数,示例代码如下:def dealWithArray(bytes): if len(bytes) < 100: return '' else: mode = bytes[10] if mode == 0: return 'RESET' elif mode == 1: return 'STOP' elif mode

2021-03-29 17:49:57 2994 1

原创 一种Qt对中文进行字典排序的方式

今天遇到了一个需求:下拉框中的各个选项需要按照字典序进行排列。这个对于英文项来说比较简单,直接使用QStringList::sort(Qt::CaseSensitive)函数即可,如下所示:QStringList valuesList;valuseList << "weiowier" << "dhgiga" << "jaghng" << "slkdf" << "aldgjasd";valuesList.sort(Qt::CaseInsens

2021-03-03 15:03:36 812 1

原创 installshield的一些高级操作(环境变量、软件调用等)

这篇博客是对于installshield使用的补充,主要介绍在installshield中如何进行一些高级设置。文章目录1. 环境变量1.1 Installshield中环境变量的相关参数1.2 常用的环境变量1.3 使用bat脚本设置环境变量2. 安装附加操作2.1 Installshield中的事件2.2 安装结束之后调用某个EXE文件的方式参考链接1. 环境变量1.1 Installshield中环境变量的相关参数Value: 添加的值On Install:Set:已经存在的环境变量

2021-02-25 10:29:59 1697

原创 数据库报duplicate XXX entry for key primary错误的可能原因以及解决方法

今天在使用数据库的过程中,发现一直报duplicate entry for key primary的错误,如下图所示:这个问题直译过来就是主键设置重复,或者说是主键冲突,因为第一次碰到这样的问题,有些不明所以,就在网上差了一些资料,发现了这么一篇文章 ======> 这是文章链接其中说到这种情况的可能原因有两种:主键没有设置自增插入线程频率较高,没有处理好事务,造成插入sql执行顺序混乱该文章中也给予了对应的解决方案,可以参考。不过这篇文章中所说到的情况并不适应于我今天遇到的问题

2021-02-23 14:23:24 94066 2

原创 VS工程中的一些概念以及常用属性设置

这里面主要介绍一下VS工程中属性的相关配置,因为是第一次写,可能有些简略。(这里面只是列出了目前为止我认为比较重要的信息)1. 宏值介绍$(SolutionDir) — 解决方案目录$(Platform) — 平台目录(x86/x64)$(Configuration) — 编译模式(Debug/Release)$(ProjectDir) — project所在的目录$(ProjectName) — 具体的project 名称,例如一个解决方案下,每一个工程都有各自的名称

2021-02-20 14:56:55 587 1

原创 Qt使用Oracle数据库的方式

文章目录使用Qt编译支持oracle的驱动库Qt使用Oracle数据库注意点因为版权问题,Qt本身不自带Oracle数据库的驱动,因此如果想要借用Qt操作Oracle数据库,需要手动进行编译。使用Qt编译支持oracle的驱动库编译的前期准备是:源码 + Oracle客户端步骤如下:打开oci文件夹(目录参考C:\Qt\Qt5.5.1\5.5\Src\qtbase\src\plugins\sqldrivers\oci,具体的目录根据自己的Qt安装路径决定)打开oci工程,并且在oci工程

2021-02-20 09:22:33 2108

原创 C++中“流”的理解

文章目录前言我理解的“流”使用“流”的优势C++中“流”的分类参考链接前言关于流本质的问题,其实从我刚开始学习C++的时候,就已经存在了。当时找了不少的资料,不过一直处于那种知其然而不知其所以然的状态,关于流的本质问题我还是一直没有搞通,始终就是懵懵懂懂的。不过在今天,我在一时兴起又在查阅流相关资料的时候,突然发现我貌似能够理解了它,因此用此篇博客来记录一下。有一点需要事先声明一下,以下的内容,皆是我自己的理解,由于个人知识积累及阅历的原因,可能会存在一些不足,如果发现有错误,还请读者予以斧正。我

2021-02-18 11:06:19 1603 2

原创 Qt的section函数介绍

section释义:部分因此我们可以知道,Qt中的section函数的功能就是从一段字符串中拿出某一段连续的部分。需要知道的定义:位置的标识从左到右:0,1,2,3,4,5……从又到左:-1,-2,-3,-4,-5……这个位置的标识一定要清楚,而且要清楚的是,这个标识是字符串被切分之后的字符串们的编号!!!不是某个字符的位置,而是子字符串的位置。如字符串为:“aaa/bbb/ccc/ddd/eee/fff”从左到右的对应编号关系为:编号值0aaa1bbb2

2021-02-05 17:47:10 5752

原创 C++中字符串和数字的相互转化

数字→字符串:to_string()字符串→整型:stoi()to_string()在转化浮点型数据的时候默认精度为6(小数点后保留6位小数),鉴于此未找到可以控制位数的函数,如果有需要,可以自己写一个。string str1("123456");cout << stoi(str1) << endl;int iNum = 666;double dd = 123.4;cout << to_string(iNum) << ends <<

2021-01-26 15:21:40 342 2

原创 VS编译器在调试的时候添加参数agrv的方式

最近做的项目涉及到在软件启动的时候需要参数,但是一开始我不知道怎么在VS中添加参数,采取的方法就是通过cmd调用编译之后的版本,这种方法不仅麻烦而且没法调试。后面经过我经理的提醒,可以在VS中添加调试需要的参数,如下:右键项目属性,在“调试”中选择“命令参数”,输入需要的参数即可。...

2021-01-26 14:00:28 724

原创 C++对于文件的操作(4)——更改文件指定位置的数据(在新旧数据长度不一致的情况下)

上篇博客说到了在“新旧长度一致”的情况下如何更改文件制定位置的数据,这一篇就来说明一下如何在新旧长度不一致的情况下更改文件中某一行的数据。具体的思路主要是:遍历行→保存行→更改指定行→保存后面的行→重写文件。简而言之,找到需要修改的行,然后修改之,保存前面的数据,保存后面的数据,重写即可。示例代码如下:void modifyFile(const string & fileName){ if (!fileName.empty()) { fstream file(fileName, i

2021-01-26 13:48:45 855 1

原创 C++对于文件的操作(3)——更改文件指定位置的数据(在新旧数据长度一致的情况下)

如果需要对于文件的某一个位置(或者是某一段位置)进行修改(前提是大小长度一致,这点一定要注意),一个可行的方法就是定位到需要改的地方,然后直接替换,然后重写这段数据。这里面需要用到的就是定位函数,和瞬移函数(`・ω・´),主要是tellg,tellp,seekg, seekp,这四个函数的具体的使用详见文章末尾的参考链接,这里只简单进行说明一下,tellg和tellp是用来获得文件句柄额当前位置的,而seekp、seekg是将文件句柄跳跃到具体的位置的。ifstream 类和 fstream 类有 s

2021-01-26 12:21:35 1639

原创 C++对于文件的操作(2)—— 使用istringstream实现split功能

因为这个软件的功能涉及到字符串的切割并重组,不过因为string中没有split函数,因此就想自己写一个字符串分割函数。在网上查阅了相关的资料之后,发现istringstream流可以实现这个功能。istringstream流可以绑定任意的string字符串,并且可以像fstring似的把被操作的对象当成一个“流”进行处理,并且istringstream有一个getLine函数的重载函数,可以实现对于指定分隔符的分割操作。注意,在使用istringstream之前,需要包含他的头文件sstream,代

2021-01-26 11:48:50 350

原创 C++对于文件的操作(1)—— 使用fstream执行对于文件的读写操作

以前读写文件一般使用的是Qt的QFile类,不过这次因为这个软件需要比较小巧,使用Qt就不算方便了,因为使用Qt的话,在打包的时候会链接上各种东西。因此,最后决定直接使用C++的fstream类进行读写(至于为什么不适用C的方式,主要原因在于C++在这方面控制的要比C好)。示例代码如下:void readFile(const string& fileName){ fstream file(fileName, ios::in); if (!file.is_open()) { ce

2021-01-26 11:21:39 452

原创 关于多个信号响应一个槽的时候的一个注意点

Qt的信号和槽机制,允许多个信号响应一个槽,平时也这么写也没有发现有什么不对的地方,但是在今天我写一个下拉框和多个下拉框显示响应显示的时候,却出现了一些意料之外的错误 —— 槽函数一直被进入,感觉上没有什么逻辑。后来发现是因为另关联的7个下拉框在一个变化的时候另外六个也有很大的几率在变化, 这就导致槽函数在处理一个下拉框变动的过程中,这个槽函数会因为另外的下拉框的变动,再次被触发,这就导致了bug的发生。鉴于此,在多个信号响应一个槽函数的时候,最好在槽函数的开始调用disconnect,在槽函数结束之后

2021-01-20 11:55:25 557

原创 关于connect函数参数的一些思考

今天在看示例代码的时候,发现了这么一条语句: connect(m_themeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &ThemeWidget::updateUI);其实就是很常见的connect语句,这种连接方式我以前也用过,不过绝大多数情况下我用的是SIGNAL()和SLOT(),因此

2021-01-09 15:24:09 540

QWebSocket服务端代码(单线程)

单线程下的使用QWebSocketServer实现的服务端代码(包含UI界面),支持多客户端),环境为Qt5.9.8,编译器为MSVC2015 64bit。

2022-08-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除