- 博客(24)
- 收藏
- 关注
原创 (二十三)槽函数的书写规则导致槽函数触发2次的问题
在创建QT的信号和槽时,经常无意间保留着QT书写槽函数的习惯,或者在QT设计界面直接右键【转到槽】去创建槽函数,但是后期需要用到disconnect时,又重新写了一遍connect函数,那么你会发现实际槽函数执行了2遍。为了避免这种方式的错误,那么我们最好在写槽函数的时候,不要遵守QT的槽函数明明方式,最简单的就是不要加on_;很明显这个命名规则是符合QT命名规则的,那么我们此时不去创建connect,仅仅去emit一个signal会发生什么呢?可以看到实际槽函数执行了2遍,这就不符合我们的实际需求了。
2023-04-10 14:39:12 674
原创 (二十二)QT获取Windows最大、最小化信号——QWindowStateChangeEvent
Windows的窗口属性包含:最小、最大、正常模式,一般创建项目,如果不使用setWindowFlags函数取消最大最小按钮,那么右上角会自动包含最大、最小按钮,点击按钮可以最大最小窗口。并且点击状态栏上的图标,可以最大最小化窗口。那么如何获取Windows的窗口属性变化、做个性化处理呢?Windows提供了QWindowStateChangeEvent事件,通过拦截改事件,我们可以做个性化处理。一、WindowState枚举值首先我们需要了解QT定义的Windows窗口属性,QT提供了以下几种枚举:
2021-06-07 20:03:46 3460 2
原创 (二十一)QT的构造函数重载
在实际开发中,我们可能遇到一个问题:对于一个类,我们可能需要传递给它不同的参数,让它执行不同的行为;或者在使用旧的类时,我们希望加上一个新的参数,但是这个参数在旧的逻辑中不使用,需要在新的逻辑中使用,如果我们改了这个类,会导致使用旧的类的函数同步修改,这是我们不希望的,因为谁都不希望重构旧的代码(。。。)遇到以上情况,更多时我们会重新写一个方法或者干脆新建一个类,但是如果你需要使用老的类中的函数并且老的函数大量重复,这就会造成代码冗余,遇到这个问题,其实我们可以考虑重载构造函数,使用多个构造函数达到这个目
2021-01-05 14:30:22 2858 1
原创 (二十)VS2015 提示“无法查找或打开 PDB 文件”探讨
安装VS2015以后,我尝试着编写了一个测试用的test项目,但是运行时,提示“无法查找或打开PDB文件”,并且有提示“未找到依赖dll”其实这就很奇怪了,因为PDB文件是编译dll产生的,并且这些dll明显是系统dll,我不需要它编译的PDB文件啊。我去查找了一下我的电脑,这些dll都是正常存在的,并没有缺失。在网上找了很多资料,都是要求把“启动源服务器支持、符号服务器打开”,但是打开符号服务器以后,会特别慢,特别是微软的符号服务器时不时被墙、自己抽风,所以这个方法肯定不能解决问题。我怀疑是不是我
2020-12-17 09:24:38 3779
原创 (十九)QWidget显示水印
有时候,我们可能需要在软件主界面上显示水印,例如出于安全考虑,界面上显示账号信息,看到水印就知道是谁截图了。最常用的做法就是新建一个透明的图片,在图片上显示水印,再把水印覆盖到主界面背景上。首先,我们需要创建一个图片。考虑到一般的水印信息都是斜着的,我们考虑旋转45度的角度,如下:#include <QPainter>QPixmap MainWindow::setWaterMask(){ QPixmap pix(ui->widget->width(),ui->w
2020-12-07 16:17:00 2372 1
原创 (十八)QT获取打开文件的路径和文件名
我们在实际工作中,需要读取某个文件的信息,例如要求客户选择某个文件、读取文件信息,这时候我们就需要一个能打开文件的窗口,提供客户选择。QT为此提供了各种方法,例如常用的getOpenFileName()可以读取某个文件的路径、getOpenFileNames()读取多个文件的路径等等。这些方法都存在QFileDialog类中,并且都是静态函数,你可以直接调用这些函数。#include <QFileDialog>QFileDialog::getOpenFileName();//参数是必须的,
2020-12-05 22:57:58 19735 2
原创 (十七)QT生成PDF文件
在实际情况中,我们有时候会遇到需要把txt、html或者图片变成PDF文件的情况,例如把检测结果生成PDF文档给客户等等。QT使用QPrinter来实现这个功能。一、QT5的修改QT5把所有打印的相关类,包括QPrinter、QPrintDialog都放到了Qt Print Support模块,如果你只是在.cpp文件中包含QPrinter库,在编译阶段就会报错,你需要先修改.pro文件,加上这句:QT += printsupport告诉QT,这个项目需要Print Support模块,再在.cp
2020-12-04 18:37:38 7989 10
原创 (十六)QT启动外部程序和URL
在工作中会遇到一种情况,启动外部程序,例如你需要客户打开浏览器或者你的工程和其他程序是联动的等等。QT提供了QProcess类来启动外部程序,启动外部程序。一、启动外部程序的方式1.startDetached()通常情况下,我们启动程序后就不会再次关注该程序,那么我们就可以使用startDetached()方法,它有一个bool的返回值,简单的告诉你程序是否启动了。并且即使我们的程序关闭了,我们打开的程序也不会关闭,依然保持自己的状态(也就是不论它是关闭、崩溃、打开中,都和我们的程序无关)bool
2020-11-22 19:11:57 3255
原创 (十五)QT利用ini配置文件实现单个工程多个版本功能
在实际项目中,经常会遇到需要存储或者读取配置文件的问题。例如,依靠配置的某个值,你可以打开或者关闭某个功能或者界面显示,这是非常方便的,能让你只需要维护一套代码、几个配置文件,就可以提供不同的项目给不同的客户类型使用。配置的值你可以放在注册表中,但是注册表有一个问题就是:如果你无法读写或者被清除,就会导致项目显示有问题。所以常用的办法就是写入配置文件。QT提供了QSettings类来读写ini文件,即常见的配置文件。ini文件的定义可以百度查询,它就是一个Windows原来采用的系统配置文件,在目前几乎
2020-11-18 19:53:29 595 3
原创 (十四)常用的QString函数
QString是QT中的string类,用于处理和字符串相关的事务,有意思的是QString的存储方式,用的是Unicode,16位QChar存储,可以存储汉字。1.字符串大小在不少博客中,可以看到博主写汉字在QString中占据一个字符,但是实际在QT5(QT5.14.2)中,汉字的字符变成了2,即和std::string的表现一致。估计是QT为了不造成误解,特意修改的,代码如下: QString s = "我"; qDebug() << "QString : "<&
2020-11-17 15:14:44 4443
原创 (十三)QT的线程
QT实际是有两种线程写法的:第一种就是常见的写法:继承QThread类,重写run函数,把需要子线程执行的任务放在run函数中,调用start,线程开始执行。这种写法有个缺点就是:需要线程执行的任务都要放在run函数中,如果你在run中放一个signal,通知run函数外的槽函数执行某个操作,那么这个槽函数就会在主线程中执行(即使这个槽函数是在子线程类中的,也会在主线程中执行)。这对于使用信号槽方式的QT来说是无法接受的,因此QT强烈建议大家不要使用这种方式。另外一种就是QT推荐的moveToThre
2020-11-11 15:24:36 466 2
转载 (十二)QT中文乱码问题
原文出处:https://blog.csdn.net/sinat_36053757/article/details/70142078本来想自己总结下,结果发现有人写的更好,其中的方法一就是我经常使用的:1.把平时要用的文字写成一个List,中文和英文分开,QString strCNString[]、QString strENString[];(你有多少个语言就写多少个list)2.写一个程序,传参为语言ID和文字ID3.按照语言ID查找中文或者英文的list,使用文字ID查找对应的文字。这样可以代替
2020-11-10 16:50:13 270
原创 (十一)C++的四种智能指针
C++的标准模板库STL一共提供了四种智能指针,分别是auto_ptr、unique_ptr、shared_ptr、weak_ptr。它们的作用就是提我们管理动态内存分配。说简单点,就是怕你new/new[]了新的对象,然后忘记释放或者程序出现问题提前终止导致未运行到delete/delete[],造成内存泄露。所以如果只能能自己释放内存就好了。。。这就是智能指针存在的意义。智能指针实际是个类对象,它管理一个指针(真正意义上的指针),在类对象失效(超出作用范围)时,调用类对象的析构函数时,自动释放它指向的
2020-11-09 18:16:43 1241
原创 (十)QT信号和槽的几种联接方式以及注意事项
上一篇我们介绍了QT的信号和槽,介绍connect的时候,我看可以看到connect函数是有第五个参数的,这第五个参数就是连接方式:static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method,
2020-11-04 19:22:45 2049
原创 (九)QT的信号和槽介绍
在(一)QT学习中,我有提过信号和槽,并且说这个是QT的最有意思的地方,那么我们就先来看看这个机制是怎么样的吧首先让我们新建一个项目,来看下信号和槽的用法。信号和槽是分开的,信号就是signal,槽是slot,在QT4中你可以非常直观的看到哪个是信号,哪个是槽,因为QT4是这样写的:先定义下信号(不需要指定类型,默认就是public):signals: void signal_send_test();再定义下槽(槽必须指定类型,可以是public protect private,一般常用p
2020-11-03 17:47:25 525
原创 (八)1-100亿数字排序-分治法和K路归并算法
我上一篇中说到面试被问到1-100亿数字存储需要多大空间,实际问题是:如果有1-100亿个数字,这些数字是存放在文件中并且是乱序的,如果内存不够加载所有的数字,那么你如何给这100亿个数字排序呢?其实考察的就是分治法和K路归并算法,可惜K路归并没回答出来,这篇就讲下如果进行排序首先是分治法,“分而治之”,把一个大的问题分成n个小问题,把小问题解决后,再合并处理,子问题相互独立(就是你处理小问题1,不能影响到小问题2,即子问题之间不存在共同的问题、资源)并且和大的问题类似(例如小问题和大问题都是排序)。
2020-11-02 18:35:16 1375
原创 (七)C++ 基本数据类型及在Windows上的长度
C++的基本数据类型有:char、short、int、long、long long、double、float、 wchar_t,还有bool、指针。指针比较特殊,它在16位系统上是2字节,在常用的32位和64位上系统上是4字节,这里就不讨论了,先看下其他基本数据类型的长度吧。注意我这里的系统是Windows10的,本身是64位(vs可以手动选择32位还是64位,所以这个系统位不影响)。但是long在Windows 64位和Linux 64位下的位数是不同的,所以有疑问的可以自己在Linux下实验,Win
2020-11-01 16:59:29 536 1
原创 (六)关于NULL、nullptr和std::string::npos的问题
1.NULL和std::string::npos首先我们先来看看两个代码: QString string = "test"; if(string.toStdString().find("t") == NULL) { std::cout << "null"; } else { std::cout << "not null"; } QString string = "test";
2020-10-28 21:55:14 1212
原创 (五)QString和数字的转换
1.QString转数字QString类提供了非常方便的数字类型转换,包括常用的int float double等,也包括不常用的long long等,具体转换如下: QString string = "1"; int int_string = string.toInt();//int类型 long long_string = string.toLong();//long float float_string = string.toFloat();//float s
2020-10-27 22:33:49 15968
原创 (四)QT的事件过滤器
在(三)Qlabel显示图片 一文中,在最后我放了一张登陆的图片,图片上有一个链接不知道大家有没有注意到——获取图片验证码它是一个Qlabel,我希望点击这个label可以重新获取图片验证码,但是label的槽函数中却不包含click()信号,这该怎么处理呢?其实QT提供了一个非常方便的办法,那就是QMouseEvent鼠标事件,也就是它可以捕获你的鼠标事件,并且传递给事件过滤器。首先我们要包含一个库#include 然后声明事件过滤器即可protected: bool eventF
2020-10-24 00:13:05 364
原创 (三)Qlabel显示图片
在(一)QT学习中,我们说过label这个控件是可以显示图片的,那么这篇让我们看下如何显示图片:首先让我们创建一个项目picture,为项目布置上对应的控件label。让图片显示在label上:代码很简单,如下 QLabel *abel=new QLabel(); QImage *img=new QImage; img->load("F:\\tupian\\image.jpg"); ui->label->setPixmap(QPixmap::fromIm
2020-10-22 19:03:33 28731
原创 (二)VS调试QT项目
上一篇博客我们讲了如何新建一个QT项目,一般QT会自带调试等功能,但是QT的调试不如VS强大,并且很多人更加习惯用VS调试项目。那么如何使用VS调试QT项目呢?其实非常简单1.VS打开QT项目打开VS2017,选择文件-新建-从现有代码创建项目2.默认创建C++项目3.选择项目文件夹,即QT项目的文件夹,再给项目起个名称(这个名称只是显示在VS中,和QT项目名可以相同,不影响项目功能)4.使用外部生成系统注意:这一步非常重要,选择“使用外部生成系统” 依靠QT编译生成项目5.点击完成
2020-10-21 13:15:42 4580
原创 (一)QT学习
我们已经安装完毕QT和VS了,那么让我们看看如何开始第一个QT项目1.新建QT项目选择“文件”-“新建文件或项目”,新建我们的第一个项目,选择Application(QT)创建项目,QT Widgets Application项目包含QT设计师文件、.h和.cpp文件。为项目起一个名字,例如test,选择下一步,选择qmake构建系统,虽然QT提供的cmake是更加常见、普适的编译器,但是qmake是QT专门提供的,可以减少我们的编译工作量(例如选择cmake,你需要手动编译,因为链接器是不知道你的
2020-10-19 23:31:03 827
原创 QT5.12.9和VS2017的安装
QT和VS的安装1.QT的下载和安装如果直接访问QT的官网,网页的打开速度特别慢,因此如果你没有其他需求,我建议你直接访问QT的下载地址,地址如下:http://download.qt.io/official_releases/其中vsaddin和qt文件夹是我们需要的,vsaddin文件夹中是QT和VS的插件,没有这个插件,VS和QT无法联合使用,切记!qt文件夹中存放的是QT编译器现在我能看到的版本最旧的是5.9版本,随便选择一个5.12.9版本下载,因为我电脑是Windows的,选择qt
2020-10-18 21:59:37 1931
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人