Qt相关
文章平均质量分 52
时光清浅,不觉多年
凡是过往,皆为序章。
展开
-
Qt传递自定义类型时槽函数不响应的原因及解决方案
因项目需要,在线程中进行数据解析结束之后,需要将处理后的数据值通过信号的方式传递出来。这个值是一个自定义的类型,里面定义了解析之后的格式。typedef struct test_type{ //......}TEST_TYPE;然后就是连接信号槽了,如下:connect(pThread, SIGNAL(dataResult(TEST_TYPE)), this, SLOT(onDataResult(TEST_TYPE)));然后发现槽函数死活进不去,在查阅资料之后,找到了两种解决方法:原创 2021-09-03 10:36:03 · 4936 阅读 · 0 评论 -
关于QThread在设置parent之后,在程序关闭的时候出错问题的分析及解决方法
现象因项目需要,写了一个继承自QThread的线程类用于处理数据信息。在给继承的线程类添加了父对象之后,程序可以正常执行,但是在关闭的时候报了如下的错误:添加父对象的伪代码如下:MyThread *pThread = new MyThread(this);pThread->start();原因分析借着报错信息,提示了Destroyed while thread is still running,直译过来就是在线程仍然运行的情况下,把它摧毁了。也就是说线程还在跑的情况下,执行了其析构原创 2021-09-03 09:34:46 · 751 阅读 · 0 评论 -
QCheckBox使用时候的一个注意点
项目中需要使用一个QCheckBox来控制某些界面的显隐,并且在不满足条件的情况下,需要将CheckBox的值恢复到原先的状态。如CheckBox本身控制着远端设备的启停,从unchecked状态点击,按理说会启动设备,并将CheckBox状态变为checked。但是如果在启动的过程中失败了,这个时候需要恢复CheckBox的状态。这就是项目的需求。为了实现状态的恢复,特意设计了一个recover函数,最开始的一版使用的是setChecked()函数,如下:void recoverState(boo原创 2021-09-01 17:36:45 · 1977 阅读 · 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 · 335 阅读 · 0 评论 -
QTreeWidget的右键菜单实现
前言因为QTreeWidget有明确的父子关系,这个特点使得其可以有着明确的分级关系,对于具有明显从属关系的节点的控制是非常好的。但是也是由于这个特点,导致如果需要对其进行右键菜单的分级别展示(不同层级的节点具有不同的右键菜单)会有一定的困难。鉴于此,特意整理了一下对于这个问题的处理方式,具体的逻辑可分为两种:重写QTreeWidgetItem的方式 —— 通过dynamic_cast来确认级别(也可通过设置type的方式)设置type的方式 —— 通过type来确定级别对于不需要特殊存储的原创 2021-08-26 10:28:35 · 3747 阅读 · 0 评论 -
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 · 2452 阅读 · 1 评论 -
如何防止数据库中的表格被重复创建
对于一个项目而言,对于一个数据库的使用不会是单次的,如果数据库的创建操作是在软件启动的时候完成的,那么如何保证数据库中的表格不会被重复创建呢?以下提供两种思路。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 · 1811 阅读 · 0 评论 -
Qt的数据库事务
事务的最大的功能就是保证数据库操作的原子性。启动事务之后,如果没有异常,则可以正常提交;如果操作过程中有任何的异常,则回滚至开始的状态。Qt的数据库事务操作示例代码如下(仅做演示用,没有进行相应的判断功能):#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlError>#include <QMessageBox>#include <QSqlDriver>#includ原创 2021-06-17 11:51:14 · 1145 阅读 · 0 评论 -
QLineEdit的焦点事件
文章目录前言焦点事件QLineEdit焦点事件测试使用事件过滤器的方式重写QLineEdit的方式操作系统对于焦点事件的影响结论前言在项目中,遇到了在通过焦点事件调用系统输入法显示异常的情况,后来发现问题发生在焦点事件上,在调用输入法以及关闭输入法的时候出现了焦点的转移,这就导致输入法一直被调用。就特意研究了一下Qt的焦点事件,以及通过QLineEdit进行一些测试操作。焦点事件在应用程序中,都会有一个当前窗口,即当前获得焦点事件的窗口,这个窗口可以接受键盘的输入。焦点事件分为FocusIn和F原创 2021-05-31 10:53:01 · 8978 阅读 · 0 评论 -
笔记:关于QMap使用时候的一点技巧
这篇博客纯粹是笔记,非技术类探讨,用于记录一下我在使用QMap的时候发现的一个小技巧。今天设计界面的时候遇到一个现象,就是对于界面上的某些控件(如button)而言,在没有找到对应的数据的时候,需要显示一个默认的值(比如显示“请选择)。因为采用的容器是QMap,因此在获得某个值之前需要先找一下看看这个数据是否存在在QMap容器中,如果存在就直接将数据拿出展示,如果没有,就显示为默认值。示例代码如下:QMap<int, QString> testNamesMap;......ui.te原创 2021-04-21 15:37:15 · 1173 阅读 · 3 评论 -
使用QButtonGroup时如何做到消除全部选中项
在使用QButtonGroup的时候,为了做到只有一个被选中,因此使用到了:m_btnsBtnGroup->setExclusive(true);这一个有一个比较大的问题,但是在有一个被选中了之后,就无法恢复到全部未选中的状态,就一直会处于有且一个被选中的状态。但是有的时候需要恢复到未选中的状态,此时可以采用添加一个隐藏的按钮然后将之选中的方法,做到其他按钮看起来是没有被选中的状态。示例代码:///< 设置隐藏按钮m_pCleanBtn->setVisible(false);原创 2021-04-20 20:54:11 · 3449 阅读 · 3 评论 -
Qt中界面与界面的通信方式
Qt中经常会碰到界面和界面之间的通信,借着这个机会,就将常见的几种方式总结一下。常用的方式:信号和槽全局变量文件静态函数 + 仿单例以下就详细介绍一下。1. 信号和槽信号和槽可以说是Qt的精髓了,其本质实际上就是回调函数,具体的使用其实比较简单,只要能找到对应窗口的句柄,以及其发射的信号,或者是接收的槽,就可以实现界面与界面之间的通信。因为比较简单,这里就不多加赘述。2. 全局变量对于全局变量,本人是又爱又恨。在恰当使用全局变量的时候,可以实现代码量的大量简化,这是我喜欢它的点。原创 2021-04-02 09:53:04 · 1422 阅读 · 2 评论 -
一种Qt对中文进行字典排序的方式
今天遇到了一个需求:下拉框中的各个选项需要按照字典序进行排列。这个对于英文项来说比较简单,直接使用QStringList::sort(Qt::CaseSensitive)函数即可,如下所示:QStringList valuesList;valuseList << "weiowier" << "dhgiga" << "jaghng" << "slkdf" << "aldgjasd";valuesList.sort(Qt::CaseInsens原创 2021-03-03 15:03:36 · 903 阅读 · 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 · 2256 阅读 · 0 评论 -
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 · 6235 阅读 · 0 评论 -
关于多个信号响应一个槽的时候的一个注意点
Qt的信号和槽机制,允许多个信号响应一个槽,平时也这么写也没有发现有什么不对的地方,但是在今天我写一个下拉框和多个下拉框显示响应显示的时候,却出现了一些意料之外的错误 —— 槽函数一直被进入,感觉上没有什么逻辑。后来发现是因为另关联的7个下拉框在一个变化的时候另外六个也有很大的几率在变化, 这就导致槽函数在处理一个下拉框变动的过程中,这个槽函数会因为另外的下拉框的变动,再次被触发,这就导致了bug的发生。鉴于此,在多个信号响应一个槽函数的时候,最好在槽函数的开始调用disconnect,在槽函数结束之后原创 2021-01-20 11:55:25 · 620 阅读 · 0 评论 -
关于connect函数参数的一些思考
今天在看示例代码的时候,发现了这么一条语句: connect(m_themeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &ThemeWidget::updateUI);其实就是很常见的connect语句,这种连接方式我以前也用过,不过绝大多数情况下我用的是SIGNAL()和SLOT(),因此原创 2021-01-09 15:24:09 · 566 阅读 · 0 评论 -
QChart的简单使用
这篇博客的目的是记录一下今天学习QChart的内容以及使用初期踩到的几个坑。使用QChart的前期准备1. Qt5.9及以上版本;2. .pro文件中添加QT += charts3. 在使用QChart的各个控件之前,必须先声明一个命名空间。方法不限,可以使用 QT_CHARTS_USE_NAMESPACE 宏值,也可以手动使用 using namespace QT_CHARTS_NAMESPACE;结果展示使用QChart绘制折线图目的:绘制一个折线图,里面包含两根折线,以下是示例代码,因原创 2021-01-08 17:11:15 · 7590 阅读 · 3 评论 -
关于QTableWidget中单元格的合并
无意中发现了Qt中QTableWidget可以实现单元格的合并,函数为setSpan,函数原型如下:void QTableView::setSpan(int row, int column, int rowSpanCount, int columnSpanCount)参数为:行数、列数、需要合并的行总数、需要合并的列总数。写了一个测试函数,代码如下:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(n原创 2021-01-07 20:02:19 · 8553 阅读 · 4 评论 -
Qt中浮点数(float、double)与零值的比较
今天无意中发现了两个比较有意思的函数:qFuzzyIsNullqFuzzyCompare其中QFuzzyIsNull是浮点型与零值的比较函数,QFuzzyCompare是两个浮点型数据的比较函数。函数原型如下:[static] bool qFuzzyCompare(double p1, double p2)[static] bool qFuzzyCompare(float p1, float p2)[static] bool qFuzzyIsNull(double d)[static]原创 2021-01-06 14:57:04 · 5600 阅读 · 0 评论 -
关于Qt和C++中对于线程的控制权不同的处理方式
今天一个bug花了很大的精力才确定的位置,这个bug的起因在于主线程是用纯C++写的,但是集成的子线程却是使用Qt的QThread类写的,这就导致如果不进行特殊处理的话,C++写的主线程无法获得子线程的控制权。这就导致主线程跑主线程的,子线程跑子线程的,造成应用程序退出的时候,子线程的退出清理逻辑没法执行完,然后进程就结束了,分配给子线程的资源也已经被回收了,这就很烦。我在子线程的清理逻辑中加了一个关闭数据库的操作,现在的情况就是程序退出,数据库关闭指令没法执行!!!然后一怒之下,我就去查了查C++和原创 2020-12-17 17:06:17 · 403 阅读 · 1 评论 -
json介绍及使用QJson操作json格式数据
文章目录json格式介绍1.object对象2.array数组3.value值json格式介绍json主要是三种格式:object(对象)、array(数组)、value(值)。1.object对象object对象是使用大括号{ }括起来的部分,每一个{}都代表一个独立的对象。每个对象都是由一个或者多个无序的键值对组成的,键值对——名称/值,名称的后面跟着一个“:”,名称之间使用“,”分隔。如://上下两个大括号表明这是一个object{ //里面由一个或多个 名称/值 对组成,之间用,分原创 2020-12-11 15:46:12 · 1538 阅读 · 0 评论 -
各种数据库的查询结果限制条数的SQL语法
MySQLMySQL数据库中提供了limit关键字用来限制返回的结果集,语法为“Limit 需要返回记录的首行行数,要返回记录的条数”,例如:SELECT * FROM T_EMPLOYEE ORDER BY EMPLOYEE_ID LIMIT 10,5查询结果就是5行数据,从第10行开始。SQLServer2000微软SQL Server2000提供了TOP关键字用来返回结果集中的前N条记录,语法为“SELECT TOP 条数 字段列表 FROM 表名”。例如:SELECT TOP 10 *原创 2020-12-09 15:33:16 · 5320 阅读 · 0 评论 -
QString的toLocal8bit与toLatin1的区别
问题缘由:将QString赋值给char数组。方法:QString→QByteArray→char数组QString str("123456");QByteArray arr = str.toLocal8Bit();//Unicode编码//QByteArray arr = str.toLatin1();//ASCII编码char data[64]{0};strcpy_s(data, arr.size() + 1, arr.data());QString的toLocal8bit和toLat原创 2020-12-09 15:09:37 · 19400 阅读 · 1 评论 -
Qt控制台应用程序鼠标点击程序阻塞的问题
今天在写一个程序的时候,后台有一个线程在轮训操作,本来跑的正常的,打印输出也正常,但是在鼠标左键点击之后,整个程序阻塞了,停止运行了。如果不加更改,可以使用鼠标右击或者是键入enter恢复程序运行,但是这点很烦。这个问题真的稀奇古怪,查阅资料之后,发现问题在于Qt和win10之间的不兼容,这是一个本身的bug。鉴于我需要使用win10系统,因此,解决方法就是在控制台属性中将“快速编辑模式”取消掉。...原创 2020-12-09 15:01:20 · 986 阅读 · 3 评论 -
关于QSqlDatabase的addDatabase函数的使用注意
addDatabase的函数原型如下:[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))注意这个函数有第二个参数!!!今天遇到的问题就是:一个项目需要用到两个数据库,我就想先打开数据库,然后把所有数据库的句柄先保存起来,后面可以直接使用。但是现在出现一个问题就是:原创 2020-12-09 09:53:12 · 10178 阅读 · 7 评论 -
关于Qt中setMouseTracking函数的使用情况
setMouseTracking函数是用于设置“鼠标追踪”的,顾名思义,也就是追踪鼠标。所谓的追踪鼠标,其实就是实时得知鼠标的位置、进入离开等操作。其实,对于Qt本身来说,是有着默认的追踪逻辑的:在鼠标按下的那一刻就开始追踪。但是如果仅仅使用默认的按下才追踪的逻辑,有许多功能可能没法实现,需要扩大鼠标的追踪范围,即鼠标没有按下的时候仍然可以追踪到鼠标,这也就是使用setMouseTracking(true)的使用情况。...原创 2020-12-07 09:42:17 · 1839 阅读 · 0 评论 -
梦回去年学Qt的时候一个让我头痛死的窗口移动函数
突发奇想,回顾了一下去年刚开始学Qt的时候的样子,就写了下面的代码://头文件#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QMouseEvent>#include <QPoint>namespace Ui {class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Wi原创 2020-12-04 14:39:09 · 106 阅读 · 0 评论 -
关于Qt重复创建数据库中的表格的报错以及解决方案
今天在写一段如下测试代码的时候,在多次执行代码之后,会出现一个问题:bool MainWindow::createDatabase(const QString &dbName){ QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(dbName); if (!db.open()) { ui->textEdit->append(db.las原创 2020-11-26 10:20:16 · 1135 阅读 · 0 评论 -
关于使得QListWidget可以始终显示在最后一行的方法
目的:实现在不断添加item的情况下,保持QListWidget始终展示在最后一行。方法:使用QListWidget::model()->setCurrentRow(QListWidget::model()->rowCount()-1);可以强制跳到最后一行,但是有一点不好就是默认选中最后一行。使用QListWidget::scrollToBottom();本函数可以保持始终展示滚动条的最后一个item,并且不会出现选中item更改的情况。建议使用第二种方式。...原创 2020-11-02 14:23:19 · 4592 阅读 · 0 评论 -
Qt读写json文件
发几个链接吧。Qt解析Json使用Qt读写JSON文件原创 2020-10-29 16:25:48 · 366 阅读 · 0 评论 -
关于事件过滤器eventFilter的一些想法
Qt是一种“事件驱动”的框架,其通信核心就是eventLoop事件循环。其他的东西不多言,这里提一下其中一个比较特殊的东西——事件过滤器的一些思考。事件过滤器的函数原型为:[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)虚函数:意味着可以override,可以定制自己需要的事件过滤器。bool:return type为bool类型,表示该事件是否被成功过滤。true表示过滤成功,不再继续往下分发;false原创 2020-10-17 16:14:57 · 296 阅读 · 0 评论 -
一种快速将QByteArray以16进制码的形式显示的方式
最近有个功能涉及到将一串字节流按照十六进制的方式进行展示,以下是我原先的方式:if (!arrData.isEmpty()) { QString strRtn; int iRow = (arrData.size() % 16) ? (arrData.size() / 16 + 1) : (arrData.size() / 16); for (int i(0); i<iRow; ++i) { //添加地原创 2020-10-15 14:36:20 · 808 阅读 · 0 评论 -
关于事件循环
今日方知我是我。参考文章原创 2020-10-12 10:34:02 · 154 阅读 · 1 评论 -
关于QSettings的使用
QSettings用于保存界面的信息以及一些用户需要保存在注册表内的一些信息。这个类以前有所耳闻,但是一直没用过,不过现在因为项目需要,在看了教程以及一些示例,以及自己的使用之后,总结一下基本的用法。初始化在创建一个QSettings对象的时候,必须指定“公司、组织”名称,以及“产品名称”,这个是唯一标识符。如:QSettings settings("Tecent", "QQ");上面就表明了这个setting是针对于“Tecent”公司的“QQ”产品。不过呢,如果在一个程序中需要多次使用到Q原创 2020-10-10 16:02:02 · 1090 阅读 · 1 评论 -
关于Qt中‘/‘和‘\‘转化的方式
在文件路径中,常用的方式有两种:使用"/";使用"\’.这两种方式都可以用来表示文件的路径。一般可以通用,但是在某些情况下(比如比较路径是否相等),’\‘和’/'就会造成困扰。今天发现Qt中有两个非常好用的接口:[static] QString QDir::fromNativeSeparators(const QString &pathName)[static] QString QDir::toNativeSeparators(const QString &pathNam原创 2020-10-09 15:01:26 · 1701 阅读 · 0 评论 -
关于Qt中使用QFile打开文件时遇到问题的分析
项目场景:在文件打开的时候,使用QFile的QIODevice的不同模式,会出现不同的表现(这是我一个同事当时遇到的问题,现在拿来分析分析,以下的所有事例代码均用于示范使用,有些内容因为不是特别重要就给抹去了,因此显得可能有些不规范,如果读者想要自己去实现的话,需要将其添加完整)。问题描述: QFile的文件打开常用的集中方式包括只读、只写、读写等。当时我那个同事在使用QIODevice::ReadWrite或者是QIODevice::WriteOnly模式时,会出现文件打开失败的情况。当时我挺好奇原创 2020-09-13 21:16:19 · 19966 阅读 · 2 评论 -
Qt调用ping语句
先介绍一下ping语句,详见cmd指令:遇到一个情况,就是需要在Qt的程序中定时查看局域网中主机的状态,询问好友以及查阅相关资料后发现,可以使用Qt中的QPorcess调用ping语句来实现该功能。事例代码如下:#include <QProcess>#include <QDebug>int main(int argc, char *argv[]){ if (0 == Process::execute("ping 127.0.0.1 -w 1")) { qDeb原创 2020-08-05 22:06:09 · 2847 阅读 · 0 评论 -
关于自定义QGraphicsItem的注意点
记住,只要涉及到QRectF的操作,一律不能使用无符号型的数据,尽可能使用double!!!比如boundRect函数的返回值,再比如painter在绘图的时候,如果需要用到QRectF,也绝对不能使用unsigned!!!血泪教训!!!...原创 2020-08-01 15:37:28 · 438 阅读 · 0 评论 -
关于Qt中的QStringLiteral
关于乱码的解决方案,目前其实有好几种方法,比如在MSVC编译器下设置execution_character的方式,又或者是采用QString中的fromLocal8Bit等的方式,但是都有着局限性。今天发现了一个比较好的宏QStringLiteral的方式,对于需要展示的中文添加修饰,可以比较好地解决这个问题。literal:adj 文字的;逐字的;无夸张的...原创 2020-06-25 22:42:19 · 1357 阅读 · 0 评论