嵌入的Qt对话框输入一些东西相关(.exec/.show etc)

基本框架

1
2
3
4
5
6
7
8
9
10
11
12
13

# some content load from remote data service
# ... code ignored ...

app = QApplication([])
dialog = ContentEditDialog(original_content)
dialog.exec()
# dialog.show()
# app.exec()

updated_content = dialog.collect_edited_content()

print(updated_content)
  • 只有dialog.exec():程序阻塞,编辑生效。
  • 只有dialog.show(): 程序不阻塞,对话框一闪即逝,无法编辑。
Read More

Windows端口成为系统保留端口的问题

问题背景

因为要使用Redis,所以装了WSL,但启动后发现SS打不开了,提示xxx端口被系统保留。

参考文后所附文章:

  • Windows 中有一个「TCP 动态端口范围」,处在这个范围内的端口,有时候会被一些服务占用。在 Windows Vista(或 Windows Server 2008)之前,动态端口范围是 1025 到 5000;在 Windows Vista(或 Windows Server 2008)之后,新的默认起始端口为 49152,新的默认结束端口为 65535。
Read More

Github:解除Fork关系

开发者在利用GitHub进行项目开发时,常会遇到与Fork操作相关的一系列挑战,尤其是在项目独立发展后,这些挑战尤为突出。以下是几个关键问题及其有条理的重述:

1. 项目独立发展后的管理难题
  • 深度定制与分化:最初通过Fork一个仓库开始的项目,随着时间推移,可能经历了从功能扩展到开发语言的变更,导致该仓库与原始父仓库在各个方面都已显著分化,各自独立发展。

Read More

【C++知识库】定义指向成员函数的函数指针

要在 C++ 中定义一个指向类成员函数的原始函数指针,你需要知道成员函数有一个隐式的 this 指针作为它们的第一个参数,这使它们与自由函数或静态成员函数区别开来。因此,声明指向成员函数的指针的语法包括类名和 ::* 操作符。
这是定义指向非静态成员函数的原始函数指针的一般语法:

1
ReturnType (ClassName::*pointerName)(ParameterTypes...) = &ClassName::FunctionName;

示例:

考虑一个类 MyClass,它有一个成员函数 doSomething:

Read More

【C++知识库】关于std::function的开销

在 C++ 中使用 std::function 相比于使用函数指针或直接函数调用会引入一定的运行时成本。这个成本主要是由于 std::function 使用的类型擦除机制,使其能够存储、复制和调用任何与其签名匹配的可调用目标(函数、lambda 表达式、bind 表达式或其他函数对象)。以下是导致其运行时成本的关键因素:

  1. 间接性:std::function 涉及一个额外的间接层级。当你调用一个 std::function 时,它内部通过指向虚函数表(vtable)的指针调用存储的可调用对象。这种间接性可以阻止某些编译器优化,如内联,这些优化对于直接函数调用或甚至是函数指针来说更可行。
  2. 堆分配:对于超出小对象优化(SOO)阈值(这是实现定义的)的可调用对象,std::function 可能会执行堆分配。这可能引入动态内存分配/释放的开销,并可能导致堆碎片化。然而,对于小对象,std::function 通常使用一种优化来在栈上存储对象,避免了堆分配。
  3. 类型擦除开销:使 std::function 能够存储任何匹配签名的可调用类型的类型擦除机制也引入了开销。这是因为它必须维护对各种可调用类型的统一接口,这涉及到存储额外的元数据,并可能执行动态类型检查。
Read More

【C++知识库】关于stdafx.h

  stdafx.h是Visual Studio项目中用于加速构建过程的预编译头文件。stdafx.h的名称是传统上的,来源于Visual Studio的早期版本,但它本身没有任何内在的含义。使用预编译头文件可以显著减少大型项目的编译时间。

预编译头文件的工作原理

  当你编译一个 C++ 程序时,编译器会处理每个编译单元(通常是一个 .cpp 文件)中包含的头文件。这个过程可能非常耗时,特别是对于有许多头文件在多个编译单元中被包含的大型项目。为了优化这一点,引入了预编译头文件的概念。

  预编译头文件被编译一次,然后在多个编译单元中重用。这意味着,只要这些头文件没有改变,编译器就可以跳过在每个编译单元中处理预编译头文件中包含的头文件,从而加速编译过程。

stdafx.hstdafx.cpp

Read More