<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sunatmine的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/sunatmine</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; sunatmine]]></copyright><item><title><![CDATA[（二十三）槽函数的书写规则导致槽函数触发2次的问题]]></title><link>https://blog.csdn.net/sunatmine/article/details/130059073</link><guid>https://blog.csdn.net/sunatmine/article/details/130059073</guid><author>sunatmine</author><pubDate>Mon, 10 Apr 2023 14:39:12 +0800</pubDate><description><![CDATA[在创建QT的信号和槽时，经常无意间保留着QT书写槽函数的习惯，或者在QT设计界面直接右键【转到槽】去创建槽函数，但是后期需要用到disconnect时，又重新写了一遍connect函数，那么你会发现实际槽函数执行了2遍。为了避免这种方式的错误，那么我们最好在写槽函数的时候，不要遵守QT的槽函数明明方式，最简单的就是不要加on_；很明显这个命名规则是符合QT命名规则的，那么我们此时不去创建connect，仅仅去emit一个signal会发生什么呢？可以看到实际槽函数执行了2遍，这就不符合我们的实际需求了。]]></description><category></category></item><item><title><![CDATA[（二十二）QT获取Windows最大、最小化信号——QWindowStateChangeEvent]]></title><link>https://blog.csdn.net/sunatmine/article/details/117426362</link><guid>https://blog.csdn.net/sunatmine/article/details/117426362</guid><author>sunatmine</author><pubDate>Mon, 07 Jun 2021 20:03:46 +0800</pubDate><description><![CDATA[Windows的窗口属性包含：最小、最大、正常模式，一般创建项目，如果不使用setWindowFlags函数取消最大最小按钮，那么右上角会自动包含最大、最小按钮，点击按钮可以最大最小窗口。并且点击状态栏上的图标，可以最大最小化窗口。那么如何获取Windows的窗口属性变化、做个性化处理呢？Windows提供了QWindowStateChangeEvent事件，通过拦截改事件，我们可以做个性化处理。
一、WindowState枚举值
首先我们需要了解QT定义的Windows窗口属性，QT提供了以下几种枚举：
]]></description><category></category></item><item><title><![CDATA[（二十一）QT的构造函数重载]]></title><link>https://blog.csdn.net/sunatmine/article/details/112232042</link><guid>https://blog.csdn.net/sunatmine/article/details/112232042</guid><author>sunatmine</author><pubDate>Tue, 05 Jan 2021 14:30:22 +0800</pubDate><description><![CDATA[在实际开发中，我们可能遇到一个问题：对于一个类，我们可能需要传递给它不同的参数，让它执行不同的行为；或者在使用旧的类时，我们希望加上一个新的参数，但是这个参数在旧的逻辑中不使用，需要在新的逻辑中使用，如果我们改了这个类，会导致使用旧的类的函数同步修改，这是我们不希望的，因为谁都不希望重构旧的代码（。。。）
遇到以上情况，更多时我们会重新写一个方法或者干脆新建一个类，但是如果你需要使用老的类中的函数并且老的函数大量重复，这就会造成代码冗余，遇到这个问题，其实我们可以考虑重载构造函数，使用多个构造函数达到这个目]]></description><category></category></item><item><title><![CDATA[（二十）VS2015 提示“无法查找或打开 PDB 文件”探讨]]></title><link>https://blog.csdn.net/sunatmine/article/details/111307844</link><guid>https://blog.csdn.net/sunatmine/article/details/111307844</guid><author>sunatmine</author><pubDate>Thu, 17 Dec 2020 09:24:38 +0800</pubDate><description><![CDATA[安装VS2015以后，我尝试着编写了一个测试用的test项目，但是运行时，提示“无法查找或打开PDB文件”，并且有提示“未找到依赖dll”

其实这就很奇怪了，因为PDB文件是编译dll产生的，并且这些dll明显是系统dll，我不需要它编译的PDB文件啊。我去查找了一下我的电脑，这些dll都是正常存在的，并没有缺失。
在网上找了很多资料，都是要求把“启动源服务器支持、符号服务器打开”，但是打开符号服务器以后，会特别慢，特别是微软的符号服务器时不时被墙、自己抽风，所以这个方法肯定不能解决问题。
我怀疑是不是我]]></description><category></category></item><item><title><![CDATA[（十九）QWidget显示水印]]></title><link>https://blog.csdn.net/sunatmine/article/details/110820441</link><guid>https://blog.csdn.net/sunatmine/article/details/110820441</guid><author>sunatmine</author><pubDate>Mon, 07 Dec 2020 16:17:00 +0800</pubDate><description><![CDATA[有时候，我们可能需要在软件主界面上显示水印，例如出于安全考虑，界面上显示账号信息，看到水印就知道是谁截图了。最常用的做法就是新建一个透明的图片，在图片上显示水印，再把水印覆盖到主界面背景上。
首先，我们需要创建一个图片。考虑到一般的水印信息都是斜着的，我们考虑旋转45度的角度，如下：
#include &lt;QPainter&gt;
QPixmap MainWindow::setWaterMask()
{
    QPixmap pix(ui-&gt;widget-&gt;width(),ui-&gt;w]]></description><category></category></item><item><title><![CDATA[（十八）QT获取打开文件的路径和文件名]]></title><link>https://blog.csdn.net/sunatmine/article/details/110713054</link><guid>https://blog.csdn.net/sunatmine/article/details/110713054</guid><author>sunatmine</author><pubDate>Sat, 05 Dec 2020 22:57:58 +0800</pubDate><description><![CDATA[我们在实际工作中，需要读取某个文件的信息，例如要求客户选择某个文件、读取文件信息，这时候我们就需要一个能打开文件的窗口，提供客户选择。QT为此提供了各种方法，例如常用的getOpenFileName()可以读取某个文件的路径、getOpenFileNames()读取多个文件的路径等等。
这些方法都存在QFileDialog类中，并且都是静态函数，你可以直接调用这些函数。
#include &lt;QFileDialog&gt;
QFileDialog::getOpenFileName();//参数是必须的,]]></description><category></category></item><item><title><![CDATA[（十七）QT生成PDF文件]]></title><link>https://blog.csdn.net/sunatmine/article/details/110489151</link><guid>https://blog.csdn.net/sunatmine/article/details/110489151</guid><author>sunatmine</author><pubDate>Fri, 04 Dec 2020 18:37:38 +0800</pubDate><description><![CDATA[在实际情况中，我们有时候会遇到需要把txt、html或者图片变成PDF文件的情况，例如把检测结果生成PDF文档给客户等等。QT使用QPrinter来实现这个功能。
一、QT5的修改
QT5把所有打印的相关类，包括QPrinter、QPrintDialog都放到了Qt Print Support模块，如果你只是在.cpp文件中包含QPrinter库，在编译阶段就会报错，你需要先修改.pro文件，加上这句：
QT += printsupport

告诉QT，这个项目需要Print Support模块，再在.cp]]></description><category></category></item><item><title><![CDATA[（十六）QT启动外部程序和URL]]></title><link>https://blog.csdn.net/sunatmine/article/details/109959126</link><guid>https://blog.csdn.net/sunatmine/article/details/109959126</guid><author>sunatmine</author><pubDate>Sun, 22 Nov 2020 19:11:57 +0800</pubDate><description><![CDATA[在工作中会遇到一种情况，启动外部程序，例如你需要客户打开浏览器或者你的工程和其他程序是联动的等等。QT提供了QProcess类来启动外部程序，启动外部程序。
一、启动外部程序的方式
1.startDetached()
通常情况下，我们启动程序后就不会再次关注该程序，那么我们就可以使用startDetached()方法，它有一个bool的返回值，简单的告诉你程序是否启动了。并且即使我们的程序关闭了，我们打开的程序也不会关闭，依然保持自己的状态（也就是不论它是关闭、崩溃、打开中，都和我们的程序无关）
bool ]]></description><category></category></item><item><title><![CDATA[（十五）QT利用ini配置文件实现单个工程多个版本功能]]></title><link>https://blog.csdn.net/sunatmine/article/details/109775474</link><guid>https://blog.csdn.net/sunatmine/article/details/109775474</guid><author>sunatmine</author><pubDate>Wed, 18 Nov 2020 19:53:29 +0800</pubDate><description><![CDATA[在实际项目中，经常会遇到需要存储或者读取配置文件的问题。例如，依靠配置的某个值，你可以打开或者关闭某个功能或者界面显示，这是非常方便的，能让你只需要维护一套代码、几个配置文件，就可以提供不同的项目给不同的客户类型使用。
配置的值你可以放在注册表中，但是注册表有一个问题就是：如果你无法读写或者被清除，就会导致项目显示有问题。所以常用的办法就是写入配置文件。QT提供了QSettings类来读写ini文件，即常见的配置文件。
ini文件的定义可以百度查询，它就是一个Windows原来采用的系统配置文件，在目前几乎]]></description><category></category></item><item><title><![CDATA[（十四）常用的QString函数]]></title><link>https://blog.csdn.net/sunatmine/article/details/109730332</link><guid>https://blog.csdn.net/sunatmine/article/details/109730332</guid><author>sunatmine</author><pubDate>Tue, 17 Nov 2020 15:14:44 +0800</pubDate><description><![CDATA[QString是QT中的string类，用于处理和字符串相关的事务，有意思的是QString的存储方式，用的是Unicode，16位QChar存储，可以存储汉字。
1.字符串大小
在不少博客中，可以看到博主写汉字在QString中占据一个字符，但是实际在QT5（QT5.14.2）中，汉字的字符变成了2，即和std::string的表现一致。估计是QT为了不造成误解，特意修改的，代码如下：
    QString s = "我";
    qDebug() &lt;&lt; "QString : "&lt;&]]></description><category></category></item><item><title><![CDATA[（十三）QT的线程]]></title><link>https://blog.csdn.net/sunatmine/article/details/109621665</link><guid>https://blog.csdn.net/sunatmine/article/details/109621665</guid><author>sunatmine</author><pubDate>Wed, 11 Nov 2020 15:24:36 +0800</pubDate><description><![CDATA[QT实际是有两种线程写法的：
第一种就是常见的写法：继承QThread类，重写run函数，把需要子线程执行的任务放在run函数中，调用start，线程开始执行。
这种写法有个缺点就是：需要线程执行的任务都要放在run函数中，如果你在run中放一个signal，通知run函数外的槽函数执行某个操作，那么这个槽函数就会在主线程中执行（即使这个槽函数是在子线程类中的，也会在主线程中执行）。这对于使用信号槽方式的QT来说是无法接受的，因此QT强烈建议大家不要使用这种方式。
另外一种就是QT推荐的moveToThre]]></description><category></category></item><item><title><![CDATA[（十二）QT中文乱码问题]]></title><link>https://blog.csdn.net/sunatmine/article/details/109601887</link><guid>https://blog.csdn.net/sunatmine/article/details/109601887</guid><author>sunatmine</author><pubDate>Tue, 10 Nov 2020 16:50:13 +0800</pubDate><description><![CDATA[原文出处：https://blog.csdn.net/sinat_36053757/article/details/70142078
本来想自己总结下，结果发现有人写的更好，其中的方法一就是我经常使用的：
1.把平时要用的文字写成一个List，中文和英文分开，QString strCNString[]、QString strENString[]；（你有多少个语言就写多少个list）
2.写一个程序，传参为语言ID和文字ID
3.按照语言ID查找中文或者英文的list，使用文字ID查找对应的文字。这样可以代替]]></description><category></category></item><item><title><![CDATA[（十一）C++的四种智能指针]]></title><link>https://blog.csdn.net/sunatmine/article/details/109579903</link><guid>https://blog.csdn.net/sunatmine/article/details/109579903</guid><author>sunatmine</author><pubDate>Mon, 09 Nov 2020 18:16:43 +0800</pubDate><description><![CDATA[C++的标准模板库STL一共提供了四种智能指针，分别是auto_ptr、unique_ptr、shared_ptr、weak_ptr。它们的作用就是提我们管理动态内存分配。说简单点，就是怕你new/new[]了新的对象，然后忘记释放或者程序出现问题提前终止导致未运行到delete/delete[]，造成内存泄露。
所以如果只能能自己释放内存就好了。。。这就是智能指针存在的意义。智能指针实际是个类对象，它管理一个指针（真正意义上的指针），在类对象失效（超出作用范围）时，调用类对象的析构函数时，自动释放它指向的]]></description><category></category></item><item><title><![CDATA[（十）QT信号和槽的几种联接方式以及注意事项]]></title><link>https://blog.csdn.net/sunatmine/article/details/109490488</link><guid>https://blog.csdn.net/sunatmine/article/details/109490488</guid><author>sunatmine</author><pubDate>Wed, 04 Nov 2020 19:22:45 +0800</pubDate><description><![CDATA[上一篇我们介绍了QT的信号和槽，介绍connect的时候，我看可以看到connect函数是有第五个参数的，这第五个参数就是连接方式：
static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &amp;signal,
                        const QObject *receiver, const QMetaMethod &amp;method,
                ]]></description><category></category></item><item><title><![CDATA[（九）QT的信号和槽介绍]]></title><link>https://blog.csdn.net/sunatmine/article/details/109472898</link><guid>https://blog.csdn.net/sunatmine/article/details/109472898</guid><author>sunatmine</author><pubDate>Tue, 03 Nov 2020 17:47:25 +0800</pubDate><description><![CDATA[在（一）QT学习中，我有提过信号和槽，并且说这个是QT的最有意思的地方，那么我们就先来看看这个机制是怎么样的吧
首先让我们新建一个项目，来看下信号和槽的用法。信号和槽是分开的，信号就是signal，槽是slot，在QT4中你可以非常直观的看到哪个是信号，哪个是槽，因为QT4是这样写的：
先定义下信号（不需要指定类型，默认就是public）：
signals:
    void signal_send_test();

再定义下槽（槽必须指定类型，可以是public protect private，一般常用p]]></description><category></category></item><item><title><![CDATA[（八）1-100亿数字排序-分治法和K路归并算法]]></title><link>https://blog.csdn.net/sunatmine/article/details/109453662</link><guid>https://blog.csdn.net/sunatmine/article/details/109453662</guid><author>sunatmine</author><pubDate>Mon, 02 Nov 2020 18:35:16 +0800</pubDate><description><![CDATA[我上一篇中说到面试被问到1-100亿数字存储需要多大空间，实际问题是：
如果有1-100亿个数字，这些数字是存放在文件中并且是乱序的，如果内存不够加载所有的数字，那么你如何给这100亿个数字排序呢？
其实考察的就是分治法和K路归并算法，可惜K路归并没回答出来，这篇就讲下如果进行排序
首先是分治法，“分而治之”，把一个大的问题分成n个小问题，把小问题解决后，再合并处理，子问题相互独立（就是你处理小问题1，不能影响到小问题2，即子问题之间不存在共同的问题、资源）并且和大的问题类似（例如小问题和大问题都是排序）。]]></description><category></category></item><item><title><![CDATA[（七）C++ 基本数据类型及在Windows上的长度]]></title><link>https://blog.csdn.net/sunatmine/article/details/109429485</link><guid>https://blog.csdn.net/sunatmine/article/details/109429485</guid><author>sunatmine</author><pubDate>Sun, 01 Nov 2020 16:59:29 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[（六）关于NULL、nullptr和std::string::npos的问题]]></title><link>https://blog.csdn.net/sunatmine/article/details/109328216</link><guid>https://blog.csdn.net/sunatmine/article/details/109328216</guid><author>sunatmine</author><pubDate>Wed, 28 Oct 2020 21:55:14 +0800</pubDate><description><![CDATA[1.NULL和std::string::npos
首先我们先来看看两个代码：
    QString string = "test";
    if(string.toStdString().find("t") == NULL)
    {
        std::cout &lt;&lt; "null";
    }
    else
    {
        std::cout &lt;&lt; "not null";
    }

    QString string = "test";
    ]]></description><category></category></item><item><title><![CDATA[（五）QString和数字的转换]]></title><link>https://blog.csdn.net/sunatmine/article/details/109321956</link><guid>https://blog.csdn.net/sunatmine/article/details/109321956</guid><author>sunatmine</author><pubDate>Tue, 27 Oct 2020 22:33:49 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[（四）QT的事件过滤器]]></title><link>https://blog.csdn.net/sunatmine/article/details/109251220</link><guid>https://blog.csdn.net/sunatmine/article/details/109251220</guid><author>sunatmine</author><pubDate>Sat, 24 Oct 2020 00:13:05 +0800</pubDate><description><![CDATA[在（三）Qlabel显示图片 一文中，在最后我放了一张登陆的图片，图片上有一个链接不知道大家有没有注意到——获取图片验证码

它是一个Qlabel，我希望点击这个label可以重新获取图片验证码，但是label的槽函数中却不包含click()信号，这该怎么处理呢？

其实QT提供了一个非常方便的办法，那就是QMouseEvent鼠标事件，也就是它可以捕获你的鼠标事件，并且传递给事件过滤器。
首先我们要包含一个库
#include 
然后声明事件过滤器即可
protected:
    bool eventF]]></description><category></category></item></channel></rss>