C++
漫步繁华街
这个作者很懒,什么都没留下…
展开
-
Qt 强杀进程、子进程(应用)的一种方式
一、背景一般情况下,程序退出时,它调用的所有子进程都会一起退出。但异常退出的时候,并非所有的子进程都能正确退出。所以我们的做法一般都是在程序启动的前来一次检查,将上次启动没有退出的子进程杀掉,然后再继续运行程序。二、清理进程方式一1. 使用QProcess 执行杀进程命令:void ClearProcessByProcessName(const QString &strPrcessName){ if (strPrcessName.isEmpty()) {原创 2022-03-08 15:33:05 · 3832 阅读 · 0 评论 -
Qt Creator release版本进行调试
一、背景:我们在进行性Qt Creator 进行开发时,想要调试代码,通常是只需要编译 debug 版本的程序。但对于很多大型项目,引用外部第三方库中难免只存在release版本的动态库,所以,当我们的程序进行debug 调试时,往往会编译不过,导致无法调试。所以,如果我们的代码编译release版本的程序,也可以进行debug 调试就好了。二、 Qt 全局设置1. 进入Qt 的安装目录,打开编译器目录中的 msvc-desktop.conf 文件进行配置2. 设置属性将 QMAKE原创 2022-03-07 14:24:27 · 21288 阅读 · 2 评论 -
Qt 实现 Dismiss Dialog 对话框的一种方式
我们经常会遇到这样的需求,鼠标点击某个按钮之后,会弹出来一个选择框。如果鼠标点击其他地方,这个选择框就会消失的需求,例如微信表情框:Qt 实现方式不止一种,我们这里说一种最简单的方式。1. 点击Mainwindows里的按钮,我们在鼠标点击的位置显示一个对话框(QWidget):void MainWindow::on_pushButton_2_clicked(){ if (form == nullptr) { form = new Form(this);原创 2022-03-07 10:51:52 · 15650 阅读 · 0 评论 -
在浏览器(H5)打开 windows pc 应用程序.exe
想要实现的效果是打开浏览器,输入一个链接,就可以打开本地安装的应用程序。或者H5页面的一个链接,点击就能打开windows 本地安装的程序。这时候就要借助windows的注册表了,比如说我们的应用程序叫launcher.exe 。我想在浏览器输入 launcher://xxxxx 就能打开本地的 launcher.exe我们要通过自己的方式创建相应的注册表1. 创建注册表 “HKEY_CLASSES_ROOT\launcher” (homework 这个就是协议名称)...原创 2021-10-27 11:57:22 · 18982 阅读 · 0 评论 -
Qt cef3 无边框程序最小化之后,再打开 hover 状态失效
1. 使用qt + cef3 开发的 pc 桌面程序出现一个奇怪的问题,描述如下:1. 程序最小化之后,再最大化,所有Qt 按钮的hover状态都失效。2. hover 失效后的程序,showNormal 之后再 showMax。 hover状态又恢复正常。3. 将cef 加载的链接屏蔽掉,只保留C++框架,所有Qt 按钮的hover状态正常。2. 解决方法:在mainwindow 的 showEvent()函数里面设置Qt::WA_Mapped属性:void showEve原创 2021-09-23 17:51:40 · 14892 阅读 · 0 评论 -
PC C++ Qt 桌面软件防止重新启动
越来越多的 windows 桌面程序要求防止重复启动,或者说只允许同时启动一个。实现方式有很多,我们接下来梳理一下常用的做法:一、创建互斥量原理:使用 windows 系统函数 CreateMutex ,一般根据唯一的应用程序的名称来找出当前系统中是否已经存在了指定进程的实例,如果没有,则会创建一个。注意: 程序退出时,一定要调用CloseHandle(m_hMutex),不然后果很严重,可能导致以后的程序无法打开。#include "stdafx.h"#include "window.原创 2021-09-14 16:36:16 · 16038 阅读 · 0 评论 -
C++ Qt windows 利用 Copydata 方式进行进程间通讯
1. 头文件:#include <windows.h>#include <tlhelp32.h>2. 发送方:void sendMessage(){ // 根据窗口名称查找窗口句柄 HWND hWnd = ::FindWindowA(("myWindowsName"), NULL); if (hWnd == nullptr) { return; } // 组装copydata信息 std::原创 2021-08-16 18:14:07 · 14750 阅读 · 0 评论 -
Qt Quick QML 与 C++ 交互系列之二
上次说了 C++ 与 QML 交互一共有四种:注册 C++ 对象到 QML,在 QML 中访问 C++对象; QML 暴露对象给 C++ 进行交互; C++ 创建 QML 对象并进行交互; C++ 对象与 QML 通过信号槽进行交互;我们再次强调一下,这四种交互方式,是每一个要学习 QML 的程序员必须要深刻理解并熟掌握的。今天重点介绍三种方式:C++ 创建 QML 对象并进行交互 的方法;为了更快的进入节奏,我们今天还是在上次项目的基础上进行修改。1. 首先,我们创建一个 “Win原创 2020-10-28 15:43:55 · 18462 阅读 · 3 评论 -
Qt Quick QML 与 C++ 交互系列之一
QML 作为一种灵活高效的界面开发语言已经越来越得到业界的认可。QML 负责界面,C++ 负责逻辑,这也是 Qt 官方推荐的开发方式。那么 QML 与 C++ 的交互必然是每一个Qt开发老师需要掌握并且精通的。接下来,我们会对QML 与 C++ 交互的几种方式进行详细讲解。我们通过创建项目,通过例子来实现、体验并应用这几种交互方式,让我们由浅入深理解其中的原理。首先,QML 与 C++的交互大致可以分为4种形式:注册 C++ 对象到 QML,在 QML 中访问 C++对象; QML 暴露对象给原创 2020-10-24 17:44:50 · 21093 阅读 · 16 评论 -
QT 遍历 删除 QMap
QMap<int, QWidget*>::iterator iter = m_pages.begin(); while (iter != m_pages.end()){ if (presistMenuIds.contains(iter.key())) { iter++; continue; } int key = iter.key(); iter++; ...原创 2020-09-14 11:26:21 · 17278 阅读 · 1 评论 -
QString 与 LPCWSTR 互转
一、 QString 转 LPCWSTR QString myStr("hello world"); std::wstring wlpstr = myStr.toStdWString(); LPCWSTR lpcwStr = wlpstr.c_str();二、 LPCWSTR 转 QStringQString myStr = QString::fromStdWString(lpcwStr);原创 2020-08-19 18:24:11 · 18126 阅读 · 1 评论 -
QT QChart QPieSeries 空心饼状图 中心添加文字
最近在使用QT 画一个空心的饼状图,需求是空心饼状图,中心显示百分比。如下这里我们需要使用QT QChart 来画图,QChart是QT在5.7.0以后新增加的模块,属于比较新的功能。对于饼状图,我们使用QPieSeries来画饼状图。对于原始的饼状图我们画出来是下面这样的:这里有3个问题:1. 第一个就是不是空心的。经过阅读文档发现,想要饼状图变成空心,其实官方是留有接口...原创 2018-09-13 11:04:24 · 21389 阅读 · 1 评论 -
QT error: LNK2019: 无法解析的外部符号 __imp__SendMessageW@ 类型的错误 以及 pragma comment 的作用(用法)
使用QT Creator 开发一个通讯项目时候,需要使用windows系统函数,比如:#include <windows.h>#include <WinUser.h>...::IsWindow(server)::FindWindowW(nullptr,title); ::SendMessage(server, WM_COPYDATA, reinterpret_cast<WPARAM>(sender), reinterpret_cast<LPAR原创 2020-08-18 17:06:41 · 29729 阅读 · 8 评论 -
使用 C++17 fold 表达式来大幅提升的QString的拼接效率
一、前言最近学习C++17,发现一个有趣的表达式-fold expression(折叠表达式)。为什么说它是有趣的?我们先说一下另外一个C++的特性-变参模板(variadic template),这是C++11新增的的特性,作用就是它可以接受任意个模版参数,参数包不能直接展开,需要通过一些特殊的方法,比如函数参数包的展开可以使用递归方式或者逗号表达式,在使用的时候有点难度。而这次C++17中...原创 2020-03-27 19:11:19 · 17011 阅读 · 0 评论 -
好好的web页面,为什么嵌入到CEF3中就错位了?
一、问题引入 这些天在做一个windows客户端软件的二维码登陆需求,使用的是C++的框架+CEF3展示内容(二维码)的架构,其中CEF3仅仅用来展示web写的二维码。开发完成后,在测试和产品老师的电脑上居然二维码是错位的。实际效果如下:(其中二维码所在的白色区域是一个CEF3嵌套web页面,周围的蓝色区域是C++框架)图1是我做好的效果,给产品和测试老师运行的时候,...原创 2020-03-06 18:26:00 · 17449 阅读 · 4 评论 -
C++ 实现高性能内存池
一、概述在 C/C++ 中,内存管理是一个非常棘手的问题,我们在编写一个程序的时候几乎不可避免的要遇到内存的分配逻辑,这时候随之而来的有这样一些问题:是否有足够的内存可供分配? 分配失败了怎么办? 如何管理自身的内存使用情况? 等等一系列问题。在一个高可用的软件中,如果我们仅仅单纯的向操作系统去申请内存,当出现内存不足时就退出软件,是明显不合理的。正确的思路应该是在内存不足的时,考虑如何管理并...原创 2020-03-05 17:54:42 · 16169 阅读 · 1 评论 -
PC端C++软件, 开启大地址,让32位程序使用4G内存
我在以前的文章中分析过软件的内存模型(链接点击这里),从中我们可以知道,程序运行起来以后,它将有自己独立的虚拟地址空间。这个空间的大小与操作系统的位数有关。目前使用C++开发的PC端软件一般都是开发32位的。那么32位的软件,最大寻址空间也就是4GB。其中很重要的一部分是给系统内核使用的内核空间。在32位的windows操作系统中,高地址的2GB空间就是给内核使用的内核空间,用户程序空间只有2GB...原创 2019-12-25 18:48:59 · 18417 阅读 · 0 评论 -
一文让你学会PC软件升级,学不会过来打我
//创建新版本文件夹 emit changeText(QString("创建新版本文件夹...")); QString mainDir = QDir(m_OldVerPath + "/../").absolutePath(); m_NewVerPath = mainDir + "/" + m_NewVersion; result = FileOperate...原创 2019-12-20 14:58:50 · 19569 阅读 · 8 评论 -
C++ 内存模型
1. 前言对于底层开发程序来讲,程序员一定要知道程序运行在内存上的分布,这特别重要。同样,对于中级语言C++来讲,内存模型很重要!内存模型很重要!内存模型很重要! 所以今天我们来一起分析和总结一下C++程序中的内存分布情况。2. 内核空间&用户空间C++的每个程序运行起来以后,它将拥有自己独立的虚拟地址空间。这个空间的大小与操作系统的位数有关。例如在32位的系统中,程序可寻址范围是...原创 2019-12-13 15:28:30 · 15405 阅读 · 1 评论 -
C++ 内存泄露检测工具-Visual Leak Detector(VLD)
上一次我们对C++程序内存泄漏进行了总结,那么要想检查一个程序是否存在内存泄漏,面对动辄几万行的代码,想要一行一行的审查代码检查是否内存是否泄漏,显然效率很低,对于更大的项目也不太现实。所以我们需要借助一款能够自动检测内存是否泄漏(Memory Leak)的工具,就是我们今天要讲的Visual Leak Detector(VLD)一、工具描述:Visual Leak Detector是一个免...原创 2019-10-16 15:29:48 · 18073 阅读 · 0 评论 -
C++ QT内存泄漏总结
对于编程来讲,每种语言都有各自的内存管理机制,他们并不是完全相同。有的语言比如JAVA、H5等无需编程人员关心内存是怎样创建,怎么释放的,系统会对内存自动管理。但是有些语言比如C、C++等,就需要程序员手动进行内存管理,比如需要的时候进行内存申请,不用的时候需要进行手动释放。在C++中,new与delete必须配对使用(既,有一个new,有且只能有一个delete)。delete少了,可能会造成...原创 2019-10-15 19:12:43 · 2061 阅读 · 0 评论 -
QT 带有动画的 圆形进度条 水波进度条
我们在使用其他软件的时候,经常能看到各种绚丽的进度条,其中带有水波波纹的进度条就是其中一个。对于PC端软件开发使用的QT,只是提供了process bar,样式十分单一。 所以这次我们就使用QT的paint 以及定时器来实现类似的水波进度条。先看一下最终效果图:这个是怎样实现的呢? 我们仍然是在一个QWidget上的paintEvent上重绘实现图形绘制 + QTimer 实现动画效果。首...原创 2019-07-29 18:18:23 · 21040 阅读 · 51 评论 -
c++ 中 vector、list 、set 、map等相关容器的区别
1. vectorvector 封装了数组 ,是有序的。在内存中是一块连续的内存空间进行存储。但是不支持用户指定空间大小。系统首先分配一个非常大的内存空间进行预备存储,当超过此分配的空间时在进行整体重新分配一块内存空间存储。这就让人感觉可以不指定vector即一个连续内存大小的感觉。通常默认非配的控件能够完成大部分存储的。优点:1. 随机访问元素快,支持[]下标与at()访问。2. 节省...原创 2019-08-05 18:13:29 · 17466 阅读 · 0 评论 -
QT QLabel内容太长时候使用省略号
我们在使用QLabel进行内容显示的时候,通常有一个最大长度,超过这个长度怎么办呢?一个QLabel不可能显示无限长的字符串啊,这时候我们可以考虑,如果字符串长度太长的时候,我们就显示其中的一部分,剩下的用...显示。比如说我们要显示“1234567890abcdefghijklmnopqrstuvwxyz”,能不能显示成“12345...”或者“123...xyz”这样的呢?答案是肯定的。...原创 2018-10-31 20:14:00 · 25612 阅读 · 1 评论 -
QT 注释模板
QT中注释一般就有: 1.单行注释 // //int a; //return a+b;2.多行注释/**/void MainWindow::dropEvent(QDropEvent *event){ /* QString name = event->mimeData()->urls().first().toString(); ui->lin...原创 2018-02-13 15:27:23 · 4914 阅读 · 1 评论 -
QT 实现 带有动画效果的 switch button 开关按钮动
平时使用手机软件的时候,经常看到带有动画效果的开关按钮 switch button,效果非常炫。但是使用QT自带的控件并没有实现类似的switch button。如果想要使用,只能我们自己进行自己封装。先看一下效果图:怎么实现呢? 我们这次使用 QWidget 的 paintEvent 来绘制这种效果。 下面分步骤解析一下:我们先分解一下。这个效果。分为3部分,背景(圆角矩形) + 滑动...原创 2019-06-21 20:20:41 · 30048 阅读 · 120 评论 -
C++ QT PC端 防止程序重复启动的几种方式
在做客户端的过程中,我们通常会希望程序实例只运行一次,也就是只希望同时启动一个程序。所以今天就总结一下几种防止程序重复启动的方式:1.使用QT中的QLockFile:QLockFile 使用文件提供在不同的进程间的锁。锁文件可以放置多个进程同时访问同一资源。例如磁盘上的配置文件、套接字、端口、共享内存区域等。使用的时候trylock()对资源进行上锁。当程序运行的时候,上锁成功后,会自动...原创 2019-06-01 12:06:00 · 20750 阅读 · 0 评论 -
QT QDialog 对话框显示几秒钟自动关闭
在实际开发中,我们会有这样一种需求,一个提示框,用户可以手动关闭,或者在用户没有操作的情况下,显示3秒钟然后自动关闭,这样应该怎样做呢?我们的思路应该是这样的:1.对话框构造函数里,设置一个定时器2.定时器槽函数设置为close()看代码.h#ifndef SUBMITSCOREERRORDLG_H#define SUBMITSCOREERRORDLG_H#include <QDial...原创 2018-04-10 18:42:12 · 16591 阅读 · 6 评论 -
Qt QDialog 设置圆角
对于普通的控件,我们通过样式表(css)设置圆角就比较简单border-radius:5px但是这个方法对于QDialog并没有作用。经过仔细研究发现了。原来QDialog只是一个容器,对于已经设置无边框(Qt::FramelessWindowHint)的对话框,直接设置border-radius并没有作用。那怎么办呢?我们可以在QDialog里放置一个QFrame控件,所有的布...原创 2018-04-02 12:17:23 · 11789 阅读 · 5 评论 -
qt 对话框 遮罩背景
一直以来做出个弹出的对话框,使用一个半透明的遮罩住主窗口,然后显示对话框,从而更加突出对话框。需要的同学可以下载下来看看下载源码没有积分的小伙伴,评论留下你的邮箱,看到后第一时间,免费发送源码。...原创 2018-04-02 11:52:33 · 3397 阅读 · 28 评论 -
CEF3实现js与C++交互功能, Render进程中OnContextCreated绑定与OnWebKitInitialized的js扩展无法回调
研究一个东西就是一个不懈的过程,前几篇文章中都一直在研究CEF浏览器内核在MFC中的使用(当然我的习惯是将duilib应用到MFC中,既能用MFC快捷创建对话框的功能、多窗口功能<这个很重要,因为duilib所有控件是显示到一个hwnd中的,假如你在其中的控件中显示视频呢?会把所有控件都渲染了,除非你定制你的渲染库,只渲染窗口的某一部分>,又可以解决MFC自绘困难、效果...原创 2018-02-03 10:28:37 · 6410 阅读 · 0 评论 -
QT 自己画单元格 QStyledItemDelegate
1.创建继承QStyledItemDelegate的类。ScreenTreeWidgetItemDelegate::ScreenTreeWidgetItemDelegate(ScreenTreeWidget *parent): QStyledItemDelegate(parent), m_handler(parent){}2. 在创建的 类中实现paint函数,所有单元格的...原创 2018-02-13 15:58:37 · 3062 阅读 · 0 评论 -
QT 接收拖拽文件
比如有这样一个功能,点开一个按钮,然后选择或者打开一个文件。但是一步一步的选择有点麻烦。有没有简单一点的方法呢?我们想要找到一个文件,然后直接拖到程序里,就能得到这个文件的地址。好吧,有三个要点:1.设置属性this->setAcceptDrops(true);2.实现虚函数 dragEnterEvent()void MainWindow::dragEnterEvent(QDragEnter...原创 2018-02-13 15:00:53 · 7808 阅读 · 1 评论 -
QT QFont相关学习记录
1.学习QFont之前,我们先来认识一下字体的family属性,这是使用什么字体,比如我们常见的“宋体”,“楷体”以及“微软雅黑”之类的字体。 那么Qt都有哪些字体呢?在QFont类中,好像并没有介绍到。不过查找资料我们发现QT还有另一个类QFontDataBase,从这个类中,我们能够得到当前系统所有的字体(family)名称。所以我们先简单地认识一下QFontDataBase类。1.1 返回系...原创 2018-02-09 16:32:45 · 4235 阅读 · 0 评论 -
深入理解异或操作
接触C语言有好多年了,工作中一直没用过位操作,所以也一直没有注意异或操作。突然发现自己对异或操作理解的并不是那么深刻。好吧,重新学习一下。位操作预算有以下几种位操作运算功能符号用法位求反~ ~expr 左移expr1 右移>>expr1 >> expr2位与&expr1 &原创 2018-02-03 18:32:33 · 7288 阅读 · 0 评论 -
c++11 lambda 匿名表达式
[ capture ] ( params ) mutable exception attribute -> ret { body } //是完整的 lambda 表达式形式[ capture ] ( params ) -> ret { body }//const 类型的lambda表达式,该类型的表达式不能改捕获("capture")列表中的值。[ capture ] ( params ) {转载 2018-02-03 14:57:32 · 1894 阅读 · 0 评论 -
QT CEF3 消息循环处理
初次写博客,可能有点乱, 按照自己的实际经历谈一下CEF3钟遇到的一些坑,希望对以后的小伙有些帮助。 先说一下经历,当初第一次接触CEF3的时候,没做特殊处理,直接将cef3封装成控件,嵌入到QT程序中,结果QT就响应不了鼠标事件了,后来经过查资料,发现是cef3的事件循环和QT的事件循环冲突了,所以QT处理不了鼠标事件了,就是鼠标只能点击网页有反应,点击QT控件就没反应。 我原创 2018-02-02 12:07:13 · 6614 阅读 · 8 评论 -
QT C++ 获取计算机软件、硬件信息cpu、内存、显卡、操作系统等信息
在使用QT 和 C++编程过程中,我们来讲讲怎样获取计算机软件和硬件信息,包括计算机名称、cpu、显卡、内存、操作系统、几个屏幕以及每个屏幕的分辨率、硬盘信息、IP、MAC地址、公网IP、以及是否能够联网等信息。头文件包含#include <QHostAddress>#include <QNetworkInterface>#include <...原创 2018-05-09 10:29:11 · 44090 阅读 · 34 评论 -
详解 c++ 关键字 explicit
用了很久的C++ 了,今天突然被小伙伴问道,构造函数前的explicit 关键字什么作用,于是自己也只能支支吾吾的说出“为了显示调用……”很尴尬啊……典型的知道所以然不知道其所以然……好吧,搜搜资料好好地充充电…… 首先说定义,C++ 中的explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显式的,而非隐式的。跟他对应的另一个关键字是implicit...原创 2018-05-09 19:56:34 · 18977 阅读 · 1 评论 -
C++ 11 bind function
今天开始逐一学习c++11的新用法,从std::function 与 std::bind函数开始。std::function 是一个template, 在一对<>中指定类型。 std::function<int(int, int)> 表明定义的是一个有两个int类型的参数,并且返回一个int类返回值的函数对象,这个返回的可调用对象可以理解为函数指针。具体用法 std...原创 2019-04-06 20:14:36 · 16133 阅读 · 0 评论