QWidget子类无法应用QSS样式的问题

这是一个老生常谈的问题,在使用Qt进行界面开发时,我们经常会继承自QWidget来实现自定义控件(当然这里说的是非顶级窗口),此时我们发现在该自定义控件上应用QSS样式会无效。 导致这个问题的主要原因是QWidget的paintEvent函数实现为空,未做任何绘制,也没有对样式表进行初始化和绘制,其代码如下: 123void QWidget::paintEvent(QPaintEvent *){}

Qt

C++的API设计规范

《C++ API 设计》是一本非常不错的书,该书内容远远超过了它标题所指的 C++ API 设计,它不仅仅讲述了与编程语言无关的 API 设计需要遵循的一些规范,同时也介绍了很多 C++开发中需要遵守一些准则,如果在开发中能遵循这些准则,将有利于我们写出高质量的代码。

项目管理

Windows内核对象

一、什么是内核对象我们在 windows 开发中经常会遇到内核对象,如事件(Event),管道(Pipe),互斥量(Mutex),完成端口(IOCP),进程(Process),线程(Thread)等,他们都是内核对象。这些内核对象虽然通过不同的系统 API 来创建,但这些 API 都有一个共同特点,就是都需要传入SECURITY_ATTRIBUTES安全描述符结构体指针,并且返回句柄(HANDLE)。依据这个特点,我们有一个简单方法来判断对象是否是内核对象,就是看创建它的函数是否允许传入SECURITY_ATTRIBUTES安全描述符。

Windows编程

C++实现编译时断言

C++自 C++11 起支持 static_assert 编译时断言,如: 12static_assert ( bool_constexpr , message ) (C++11 起)static_assert ( bool_constexpr...

C++语言

Windows注入与拦截(3)-窗口挂载

本文主要介绍如何通过 DLL 注入的方式来实现在指定窗口的控件上挂载一个自定义窗口。 何谓挂载?和舰载机挂载导弹类似,将我们自己的窗口挂到原有程序的窗口之上,可以实现对原有窗口功能的覆盖和扩展。

HOOK

理解C/C++运行时库

运行时库(Runtime library)通俗的说就是我们的程序运行的时候所依赖的库文件。在 Windows 平台,这些库由微软提供,并以 2 种形式提供:静态库(lib)、动态库(lib+dll),每个库还分别提供了 Debug 和 Release 两个版本。

C++语言

Windows注入与拦截(2)-注入方式

一、注册表方式1.1 注入方法如题,通过注册表的方式来实现 DLL 注入,我们只需要针对特定的注册表项进行修改即可,有一点需要注意的是:如果被注入的进程是 64 位进程,则注入的 DLL 也需要是 64 位的。同理,注入到 32 位的进程也需要是 32 位的 DLL。 另外,根据被注入目标进程的位数(32 或 64)不同,注册表的位置也不同。

HOOK

Windows注入与拦截(1)-注入基础

一、注入技术的用途从Windows内存体系(1)--虚拟地址空间文章中我们可以知道: 在 Windows 系统中,每个进程都有自己私有的地址空间。当我们用指针来引用内存时,指针的值表示的是进程自己的地址空间的一个虚拟的内存地址。进程不能通过指针来引用其他进程地址空间的内存。 这种设计提升了操作系统的健壮性和安全性,比如一个进程存在缺陷,可能会引用和覆盖随机地址处的内存数据,那么我们就不用担心这个缺陷会影响到操作系统及其他进程。 独立的地址空间有利于系统的稳定性。但也带来了诸多不便,下面列举了需要跨越进程的边界来访问另一个进程地址空间的情况: 我们要从另一个进程创建的窗口来派生子类窗口,比如附着在 Windows 资源管理器上的一些小插件等。 我们需要假借其他进程之名做某些事情。 我们需要获取其他进程的更多详细信息,如加载了哪些 dll 等。 我们需要对其他进程的某些函数进行HOOK。 以及干一些羞羞的事情… 为了满足上述需求,我们可以使用 DLL 注入的技术,将我们自己开发的 DLL 注入到另一个进程的地址空间中,这样 DLL 中的代码就可以在该进程地址空间中执行。

HOOK
1121314151623