- 对于赛博文盲 ...To tell the truth, 能把 Windows 用好已经很好了.
- 对于Windows 用户, 解释其不同, 劝导其适应 Linux 的操作逻辑^(1).
- 为什么要输命令?
- 为什么更改一些设置要修改配置文件而不是按下某个设置按钮?
- 为什么用 ls 而不是 dir?
- 为什么软件在
/bin或/opt而不是在Program Files或system32 - 为什么是
ext4而不是fat/ntfs? - 为什么硬盘/U盘要手动挂载?
- 使用 C++, Qt6,制作启动器和小程序
- 引导教程使用 Godot 做成游戏风格
- 交互式学习平台(游戏化+实用指南结合)
- 核心形式:类似"虚拟实验室"的沙盒环境
- 优势:
- 避免纯游戏脱离实际,也避免枯燥文档
- 用户可在安全环境中实操(如模拟终端/文件操作)
- 即时反馈机制降低挫败感
- 禁止在业务逻辑中使用
goto语句
- 使用结构化控制流 (
if/else,for,while,switch) 替代
-
禁止万能头文件(包括自己写的)
// ❌ 禁止 #include <bits/stdc++.h> #include <Windows.h> // ✅ 正确 #include <vector> #include <QString>
-
禁止
using namespace污染命名空间
- 头文件严格禁止
using namespace - 源文件避免使用,局部可用
using std::vector;等受限形式
// ❌ 错误 (头文件中)
using namespace Qt;
// ✅ 允许 (源文件中)
void foo() {
using std::vector;
vector<int> v;
}-
有 Parent 的类禁止手动释放
// ❌ 错误 auto *button = new QPushButton(parent); delete button; // 触发未定义行为 // ✅ 正确 auto *button = new QPushButton(parent); // 由 parent 自动管理
-
无 Parent 对象需明确所有权
- 使用
QScopedPointer或智能指针管理
QScopedPointer<QFile> file(new QFile("data.txt"));- 按需引用原则
- 头文件仅包含自身依赖(前置声明优先)
- 实现文件包含直接使用的头文件
// widget.h
class QLabel; // 前置声明 ✅
// ❌ 不包含 #include <QLabel>
// widget.cpp
#include "widget.h"
#include <QLabel> // 按需引用 ✅- 头文件保护
统一使用#pragma once#pragma once // 禁止 #ifndef/#define 传统宏
- 用户可见字符串
- 所有 UI 字符串必须用
tr()包裹 - 动态字符串使用
QCoreApplication::translate()
button->setText(tr("Submit"));- 类型转换
- 使用
static_cast/dynamic_cast,禁用 C 风格转换
double d = 3.14;
int i = static_cast<int>(d); // ✅
// ❌ int i = (int)d;- 智能指针
- 优先使用
std::unique_ptr/std::shared_ptr - Qt 对象可用
QPointer做弱引用
- 信号槽连接
- 使用 Qt5 风格类型安全连接
connect(button, &QPushButton::clicked, this, &MyClass::onClick);
- 多线程
- 跨线程访问使用
QMetaObject::invokeMethod - 禁止直接跨线程修改 GUI 对象
- 资源管理
- 文件路径使用
QDir::toNativeSeparators() - 资源文件通过 Qt Resource System (
qrc) 加载
- 编译警告
- 在 CMake 中开启严格模式:
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Werror")
# 最低要求
cmake_minimum_required(VERSION 3.16...3.26)
project(MyApp LANGUAGES CXX)
# 强制 C++17 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 自动处理 Qt 资源/UI 文件
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
qt_standard_project_setup()
# 禁止隐式包含目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 添加可执行目标
qt_add_executable(MyApp
main.cpp
widget.cpp
)// widget.h
#pragma once
#include <QWidget> // 按需引用
class QLabel; // 前置声明
class Widget : public QWidget {
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
private:
QLabel *m_label; // 不暴露实现细节
};// widget.cpp
#include "widget.h"
#include <QLabel> // 实现文件直接引用
Widget::Widget(QWidget *parent) : QWidget(parent) {
m_label = new QLabel(tr("Hello Qt6"), this); // 自动内存管理
}通过遵守本规范,可确保代码的 安全性、可维护性 及 国际化支持。