课程代码仓库初始化:Part1 (144) + Part3 (29) 全量生成与验证
把川大 wiki「02.Qt方向」课程代码整理为 CMake 管理的可编译运行项目。
Part1 C/C++ 强化 (p01/, 144 目标, host gcc/g++ 构建, 全绿):
- 修复全部编译失败:补 <cstring>/<fstream>/<iomanip>/<vector> 等缺失头
(common_fix + infer_stl_includes 自动检测注入)、修正 pause() 壳注入
(改检测已转换后的 pause 调用)、namespace 提升出函数体、const 成员函数
正确性、dedupe 不再破坏函数重载集、K&R 隐式 int / 动态异常规范等
C++17 移除特性的可编译等价改写。
- 目录采用深缩写 p01/ch04/s03/ (原 part1_cpp/ch04_class_object/03_ctor_dtor)。
Part3 Qt 桌面 (p03/, 29 目标, 隔离 Qt 5.14.2 构建, 全绿):
- gen_part3.py: Qt 外壳模板 (main+QApplication+show, QTimer 自动退出便于
offscreen 验证)、AUTOMOC + .moc include、rewrite_* 处理散文混入/重载/
资源依赖、生成占位 png/gif + .qrc + rundata 样例数据。
- 修正 QLable 笔误、全角分号、.→->、Windows 路径、QApplication 阻塞事件
循环改为 QCoreApplication 等。
任务1 概念/版本验证:
- tools/std_probe.py: 跨 -std= 编译探针 (--pedantic-errors 让已废除特性硬失败)。
- tools/demo_versions/: K&R 隐式 int、三目左值、void* 转换、enum 赋整、
const 经指针、动态异常规范 共 6 个跨版本演示。
- docs/VERSION_NOTES.md: 每条「原文说法→C17/C++17 是否成立→何版本成立→已验证」。
文档: 顶层 README、docs/SOURCE_PAGES.md (页面→目录映射)、
docs/ERRATA.md (Part1 修正)、docs/ERRATA_part3.md (Part3 修正)。
另修复 tools/run.sh / run_qt.sh 的 ${1:?...} 引号语法 bug。
隔离 Qt 验证: ldd 0 系统 Qt 引用; 173/173 目标全绿; p03 offscreen 运行通过。
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
# Auto-generated by tools/gen_part3.py
|
||||
add_subdirectory(ch02)
|
||||
add_subdirectory(ch03)
|
||||
add_subdirectory(ch04)
|
||||
add_subdirectory(ch05)
|
||||
add_subdirectory(ch06)
|
||||
add_subdirectory(ch08)
|
||||
add_subdirectory(ch09)
|
||||
add_subdirectory(ch10)
|
||||
add_subdirectory(ch11)
|
||||
@@ -0,0 +1,9 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch02
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(minimal_qt_app minimal_qt_app.cpp)
|
||||
set_target_properties(minimal_qt_app PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(minimal_qt_app PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(minimal_qt_app PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch02 DEPENDS minimal_qt_app)
|
||||
@@ -0,0 +1,8 @@
|
||||
# p03/ch02 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `minimal_qt_app` | `minimal_qt_app.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh minimal_qt_app` |
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
// ============================================================================
|
||||
// minimal_qt_app — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954515:0]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QTimer>
|
||||
|
||||
// 最简单的 Widget:原文 widget.h 的占位实现
|
||||
class Widget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
Widget(QWidget* parent = nullptr) : QWidget(parent) {}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
Widget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "minimal_qt_app.moc"
|
||||
@@ -0,0 +1,9 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch03
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(button_creation button_creation.cpp)
|
||||
set_target_properties(button_creation PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(button_creation PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(button_creation PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch03 DEPENDS button_creation)
|
||||
@@ -0,0 +1,29 @@
|
||||
# p03/ch03 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `button_creation` | `button_creation.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh button_creation` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 1] .2 对象模型(对象树)
|
||||
|
||||
```cpp
|
||||
{
|
||||
QWidget window;
|
||||
QPushButton quit("Quit", &window);
|
||||
}
|
||||
```
|
||||
|
||||
### [block 2] .2 对象模型(对象树)
|
||||
|
||||
```cpp
|
||||
{
|
||||
QPushButton quit("Quit");
|
||||
QWidget window;
|
||||
quit.setParent(&window);
|
||||
}
|
||||
```
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
// ============================================================================
|
||||
// button_creation — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954525:0]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget() {
|
||||
// 第一种创建:先构造再设属性
|
||||
QPushButton* btn = new QPushButton;
|
||||
btn->setParent(this); // 设置父亲
|
||||
btn->setText(QStringLiteral("德玛西亚")); // 设置文字
|
||||
btn->move(100, 100); // 移动位置
|
||||
|
||||
// 第二种创建:构造时指定文本与父亲
|
||||
QPushButton* btn2 = new QPushButton(QStringLiteral("孙悟空"), this);
|
||||
btn2->move(100, 140);
|
||||
|
||||
this->resize(600, 400); // 重新指定窗口大小
|
||||
this->setWindowTitle(QStringLiteral("第一个项目")); // 设置窗口标题
|
||||
this->setFixedSize(600, 400); // 限制窗口大小
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "button_creation.moc"
|
||||
@@ -0,0 +1,17 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch04
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(builtin_signal_slot builtin_signal_slot.cpp)
|
||||
set_target_properties(builtin_signal_slot PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(builtin_signal_slot PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(builtin_signal_slot PRIVATE -Wall -Wextra)
|
||||
add_executable(custom_signal_slot custom_signal_slot.cpp)
|
||||
set_target_properties(custom_signal_slot PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(custom_signal_slot PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(custom_signal_slot PRIVATE -Wall -Wextra)
|
||||
add_executable(lambda_signal_slot lambda_signal_slot.cpp)
|
||||
set_target_properties(lambda_signal_slot PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(lambda_signal_slot PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(lambda_signal_slot PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch04 DEPENDS builtin_signal_slot custom_signal_slot lambda_signal_slot)
|
||||
@@ -0,0 +1,45 @@
|
||||
# p03/ch04 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `builtin_signal_slot` | `builtin_signal_slot.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh builtin_signal_slot` |
|
||||
| `custom_signal_slot` | `custom_signal_slot.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh custom_signal_slot` |
|
||||
| `lambda_signal_slot` | `lambda_signal_slot.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh lambda_signal_slot` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 1] .1 系统自带的信号和槽
|
||||
|
||||
```cpp
|
||||
connect(sender, signal, receiver, slot);
|
||||
```
|
||||
|
||||
### [block 3] .2 自定义信号和槽
|
||||
|
||||
```cpp
|
||||
自定义的信号 hungry带参数,需要提供重载的自定义信号和 自定义槽
|
||||
void hungury(QString name); 自定义信号
|
||||
void treat(QString name ); 自定义槽
|
||||
但是由于有两个重名的自定义信号和自定义的槽,直接连接会报错,所以需要利用函数指针来指向函数地址, 然后在做连接
|
||||
void (Teacher:: * teacherSingal)(QString) = &Teacher::hungury;
|
||||
void (Student:: * studentSlot)(QString) = &Student::treat;
|
||||
connect(teacher,teacherSingal,student,studentSlot);
|
||||
```
|
||||
|
||||
### [block 4] .4 Qt4版本的信号槽写法
|
||||
|
||||
```cpp
|
||||
connect(zt,SIGNAL(hungry(QString)),st,SLOT(treat(QString)));
|
||||
```
|
||||
|
||||
### [block 5] .5 Lambda表达式
|
||||
|
||||
```cpp
|
||||
[capture](parameters) mutable ->return-type
|
||||
{
|
||||
statement
|
||||
}
|
||||
```
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
// ============================================================================
|
||||
// builtin_signal_slot — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954527:0]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget() {
|
||||
// 系统自带的信号和槽:按钮 clicked → 关闭窗口
|
||||
QPushButton* quitBtn = new QPushButton(QStringLiteral("关闭窗口"), this);
|
||||
quitBtn->move(50, 50);
|
||||
resize(300, 200);
|
||||
connect(quitBtn, &QPushButton::clicked, this, &QWidget::close);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "builtin_signal_slot.moc"
|
||||
@@ -0,0 +1,68 @@
|
||||
// ============================================================================
|
||||
// custom_signal_slot — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954527:2]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPushButton>
|
||||
#include <QDebug>
|
||||
#include <QString>
|
||||
#include <QTimer>
|
||||
|
||||
// ---- 老师(发送者):饿了就发信号 ----
|
||||
class Teacher : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Teacher(QObject* p = nullptr) : QObject(p) {}
|
||||
signals:
|
||||
void hungry(); // 无参信号
|
||||
void hungry(QString food);// 带参信号(重载)
|
||||
public slots:
|
||||
void classIsOver() {
|
||||
emit hungry(); // 触发无参信号
|
||||
emit hungry(QString("汉堡")); // 触发带参信号
|
||||
}
|
||||
};
|
||||
|
||||
// ---- 学生(接收者):请客吃饭 ----
|
||||
class Student : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Student(QObject* p = nullptr) : QObject(p) {}
|
||||
public slots:
|
||||
void treat() { qDebug() << "老师饿了,请老师吃饭!"; }
|
||||
void treat(QString food) { qDebug() << "老师饿了,请老师吃" << food; }
|
||||
};
|
||||
|
||||
// ---- 聚合窗口:连接信号槽并触发演示 ----
|
||||
class MyWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
MyWidget() {
|
||||
Teacher* t = new Teacher(this);
|
||||
Student* s = new Student(this);
|
||||
// 连接无参信号/槽
|
||||
connect(t, QOverload<>::of(&Teacher::hungry),
|
||||
s, QOverload<>::of(&Student::treat));
|
||||
// 带参重载:用 QOverload<QString>::of 显式选择重载
|
||||
connect(t, QOverload<QString>::of(&Teacher::hungry),
|
||||
s, QOverload<QString>::of(&Student::treat));
|
||||
// 触发演示
|
||||
t->classIsOver();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
MyWidget w; w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "custom_signal_slot.moc"
|
||||
@@ -0,0 +1,42 @@
|
||||
// ============================================================================
|
||||
// lambda_signal_slot — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954527:6]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPushButton>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){
|
||||
QPushButton * myBtn = new QPushButton (this);
|
||||
QPushButton * myBtn2 = new QPushButton (this);
|
||||
myBtn2->move(100,100);
|
||||
int m = 10;
|
||||
|
||||
connect(myBtn,&QPushButton::clicked,this,[m] ()mutable { m = 20; qDebug() << m; });
|
||||
|
||||
connect(myBtn2,&QPushButton::clicked,this,[=] () { qDebug() << m; });
|
||||
|
||||
qDebug() << m;
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "lambda_signal_slot.moc"
|
||||
@@ -0,0 +1,13 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch05
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(dock_widget dock_widget.cpp)
|
||||
set_target_properties(dock_widget PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(dock_widget PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(dock_widget PRIVATE -Wall -Wextra)
|
||||
add_executable(central_widget central_widget.cpp)
|
||||
set_target_properties(central_widget PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(central_widget PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(central_widget PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch05 DEPENDS dock_widget central_widget)
|
||||
@@ -0,0 +1,62 @@
|
||||
# p03/ch05 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `dock_widget` | `dock_widget.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh dock_widget` |
|
||||
| `central_widget` | `central_widget.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh central_widget` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 0] .1 菜单栏
|
||||
|
||||
```cpp
|
||||
QMenuBar *menuBar() const
|
||||
```
|
||||
|
||||
### [block 1] .1 菜单栏
|
||||
|
||||
```cpp
|
||||
QAction* addMenu(QMenu * menu)
|
||||
QMenu* addMenu(const QString & title)
|
||||
QMenu* addMenu(const QIcon & icon, const QString & title)
|
||||
```
|
||||
|
||||
### [block 2] .1 菜单栏
|
||||
|
||||
```cpp
|
||||
QAction* activeAction() const
|
||||
QAction* addAction(const QString & text)
|
||||
QAction* addAction(const QIcon & icon, const QString & text)
|
||||
QAction* addAction(const QString & text, const QObject * receiver,
|
||||
const char * member, const QKeySequence & shortcut = 0)
|
||||
QAction* addAction(const QIcon & icon, const QString & text,
|
||||
const QObject * receiver, const char * member,
|
||||
const QKeySequence & shortcut = 0)
|
||||
```
|
||||
|
||||
### [block 3] .3 状态栏
|
||||
|
||||
```cpp
|
||||
//添加小部件
|
||||
void addWidget(QWidget * widget, int stretch = 0)
|
||||
//插入小部件
|
||||
intinsertWidget(int index, QWidget * widget, int stretch = 0)
|
||||
//删除小部件
|
||||
void removeWidget(QWidget * widget)
|
||||
```
|
||||
|
||||
### [block 6] .6 资源文件
|
||||
|
||||
```cpp
|
||||
<RCC>
|
||||
<qresource prefix="/images">
|
||||
<file alias="doc-open">document-open.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/images/fr" lang="fr">
|
||||
<file alias="doc-open">document-open-fr.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
```
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
// ============================================================================
|
||||
// central_widget — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954529:5]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QMainWindow>
|
||||
#include <QTextEdit>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoMainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoMainWindow(){
|
||||
QTextEdit * edit = new QTextEdit(this);
|
||||
setCentralWidget(edit);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoMainWindow w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "central_widget.moc"
|
||||
@@ -0,0 +1,37 @@
|
||||
// ============================================================================
|
||||
// dock_widget — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954529:4]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QMainWindow>
|
||||
#include <QDockWidget>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoMainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoMainWindow() {
|
||||
// 铆接部件(停靠窗口):标题 + 父对象
|
||||
QDockWidget* dock = new QDockWidget(QStringLiteral("标题"), this);
|
||||
addDockWidget(Qt::LeftDockWidgetArea, dock);
|
||||
// 设置可停靠区域范围(左/右/上/下)
|
||||
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea |
|
||||
Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoMainWindow w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "dock_widget.moc"
|
||||
@@ -0,0 +1,33 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch06
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(modal_dialog modal_dialog.cpp)
|
||||
set_target_properties(modal_dialog PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(modal_dialog PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(modal_dialog PRIVATE -Wall -Wextra)
|
||||
add_executable(modeless_dialog_stack modeless_dialog_stack.cpp)
|
||||
set_target_properties(modeless_dialog_stack PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(modeless_dialog_stack PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(modeless_dialog_stack PRIVATE -Wall -Wextra)
|
||||
add_executable(modeless_dialog_heap modeless_dialog_heap.cpp)
|
||||
set_target_properties(modeless_dialog_heap PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(modeless_dialog_heap PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(modeless_dialog_heap PRIVATE -Wall -Wextra)
|
||||
add_executable(modeless_dialog_deleteonclose modeless_dialog_deleteonclose.cpp)
|
||||
set_target_properties(modeless_dialog_deleteonclose PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(modeless_dialog_deleteonclose PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(modeless_dialog_deleteonclose PRIVATE -Wall -Wextra)
|
||||
add_executable(message_box_question message_box_question.cpp)
|
||||
set_target_properties(message_box_question PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(message_box_question PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(message_box_question PRIVATE -Wall -Wextra)
|
||||
add_executable(message_box_custom message_box_custom.cpp)
|
||||
set_target_properties(message_box_custom PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(message_box_custom PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(message_box_custom PRIVATE -Wall -Wextra)
|
||||
add_executable(file_dialog file_dialog.cpp)
|
||||
set_target_properties(file_dialog PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(file_dialog PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(file_dialog PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch06 DEPENDS modal_dialog modeless_dialog_stack modeless_dialog_heap modeless_dialog_deleteonclose message_box_question message_box_custom file_dialog)
|
||||
@@ -0,0 +1,142 @@
|
||||
# p03/ch06 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `modal_dialog` | `modal_dialog.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh modal_dialog` |
|
||||
| `modeless_dialog_stack` | `modeless_dialog_stack.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh modeless_dialog_stack` |
|
||||
| `modeless_dialog_heap` | `modeless_dialog_heap.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh modeless_dialog_heap` |
|
||||
| `modeless_dialog_deleteonclose` | `modeless_dialog_deleteonclose.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh modeless_dialog_deleteonclose` |
|
||||
| `message_box_question` | `message_box_question.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh message_box_question` |
|
||||
| `message_box_custom` | `message_box_custom.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh message_box_custom` |
|
||||
| `file_dialog` | `file_dialog.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh file_dialog` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 4] .4 消息对话框
|
||||
|
||||
```cpp
|
||||
void about(QWidget * parent, const QString & title, const QString & text)
|
||||
```
|
||||
|
||||
### [block 5] .4 消息对话框
|
||||
|
||||
```cpp
|
||||
void aboutQt(QWidget * parent, const QString & title = QString()):
|
||||
```
|
||||
|
||||
### [block 6] .4 消息对话框
|
||||
|
||||
```cpp
|
||||
StandardButton critical(QWidget * parent,
|
||||
const QString & title,
|
||||
const QString & text,
|
||||
StandardButtons buttons = Ok,
|
||||
StandardButton defaultButton = NoButton):
|
||||
```
|
||||
|
||||
### [block 7] .4 消息对话框
|
||||
|
||||
```cpp
|
||||
StandardButton information(QWidget * parent,
|
||||
const QString & title,
|
||||
const QString & text,
|
||||
StandardButtons buttons = Ok,
|
||||
StandardButton defaultButton = NoButton)
|
||||
```
|
||||
|
||||
### [block 8] .4 消息对话框
|
||||
|
||||
```cpp
|
||||
StandardButton question(QWidget * parent,
|
||||
const QString & title,
|
||||
const QString & text,
|
||||
StandardButtons buttons = StandardButtons( Yes | No ),
|
||||
StandardButton defaultButton = NoButton)
|
||||
```
|
||||
|
||||
### [block 9] .4 消息对话框
|
||||
|
||||
```cpp
|
||||
StandardButton warning(QWidget * parent,
|
||||
const QString & title,
|
||||
const QString & text,
|
||||
StandardButtons buttons = Ok,
|
||||
StandardButton defaultButton = NoButton)
|
||||
```
|
||||
|
||||
### [block 13] 6.5 标准文件对话框
|
||||
|
||||
```cpp
|
||||
connect(openAction, &QAction::triggered,
|
||||
this, &MainWindow::openFile);
|
||||
connect(saveAction, &QAction::triggered,
|
||||
this, &MainWindow::saveFile);
|
||||
```
|
||||
|
||||
### [block 14] 6.5 标准文件对话框
|
||||
|
||||
```cpp
|
||||
//打开文件
|
||||
void MainWindow::openFile()
|
||||
{
|
||||
QString path = QFileDialog::getOpenFileName(this,
|
||||
tr("Open File"), ".", tr("Text Files(*.txt)"));
|
||||
if(!path.isEmpty())
|
||||
{
|
||||
QFile file(path);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||
{
|
||||
QMessageBox::warning(this, tr("Read File"),
|
||||
tr("Cannot open file:\n%1").arg(path));
|
||||
return;
|
||||
}
|
||||
QTextStream in(&file);
|
||||
textEdit->setText(in.readAll());
|
||||
file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this, tr("Path"),
|
||||
tr("You did not select any file."));
|
||||
}
|
||||
}
|
||||
|
||||
//保存文件
|
||||
void MainWindow::saveFile()
|
||||
{
|
||||
QString path = QFileDialog::getSaveFileName(this,
|
||||
tr("Open File"), ".", tr("Text Files(*.txt)"));
|
||||
if(!path.isEmpty())
|
||||
{
|
||||
QFile file(path);
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
||||
{
|
||||
QMessageBox::warning(this, tr("Write File"),
|
||||
tr("Cannot open file:\n%1").arg(path));
|
||||
return;
|
||||
}
|
||||
QTextStream out(&file);
|
||||
out << textEdit->toPlainText();
|
||||
file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this, tr("Path"),
|
||||
tr("You did not select any file."));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### [block 15] 6.5 标准文件对话框
|
||||
|
||||
```cpp
|
||||
QString getOpenFileName(QWidget * parent = 0,
|
||||
const QString & caption = QString(),
|
||||
const QString & dir = QString(),
|
||||
const QString & filter = QString(),
|
||||
QString * selectedFilter = 0,
|
||||
Options options = 0)
|
||||
```
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
// ============================================================================
|
||||
// file_dialog — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954535:12]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QMainWindow>
|
||||
#include <QAction>
|
||||
#include <QMenuBar>
|
||||
#include <QToolBar>
|
||||
#include <QFileDialog>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QMessageBox>
|
||||
#include <QTimer>
|
||||
|
||||
class MainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
public:
|
||||
MainWindow() {
|
||||
QAction* openAction = new QAction(QStringLiteral("打开..."), this);
|
||||
QAction* saveAction = new QAction(QStringLiteral("保存..."), this);
|
||||
menuBar()->addMenu(QStringLiteral("文件"))->addAction(openAction);
|
||||
menuBar()->addMenu(QStringLiteral("文件"))->addAction(saveAction);
|
||||
connect(openAction, &QAction::triggered, this, &MainWindow::openFile);
|
||||
connect(saveAction, &QAction::triggered, this, &MainWindow::saveFile);
|
||||
}
|
||||
private slots:
|
||||
void openFile() {
|
||||
QString path = QFileDialog::getOpenFileName(this, QStringLiteral("打开文件"));
|
||||
if (path.isEmpty()) return;
|
||||
QFile file(path);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
QMessageBox::warning(this, QStringLiteral("错误"), QStringLiteral("打开失败"));
|
||||
return;
|
||||
}
|
||||
QTextStream in(&file);
|
||||
QString text = in.readAll();
|
||||
file.close();
|
||||
QMessageBox::information(this, QStringLiteral("内容"), text);
|
||||
}
|
||||
void saveFile() {
|
||||
QString path = QFileDialog::getSaveFileName(this, QStringLiteral("保存文件"));
|
||||
if (path.isEmpty()) return;
|
||||
QFile file(path);
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||
QMessageBox::warning(this, QStringLiteral("错误"), QStringLiteral("保存失败"));
|
||||
return;
|
||||
}
|
||||
QTextStream out(&file);
|
||||
out << QStringLiteral("示例保存内容");
|
||||
file.close();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
MainWindow w; w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "file_dialog.moc"
|
||||
@@ -0,0 +1,55 @@
|
||||
// ============================================================================
|
||||
// message_box_custom — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954535:11]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){ doDemo(); }
|
||||
private slots:
|
||||
void doDemo(){
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("The document has been modified."));
|
||||
msgBox.setInformativeText(tr("Do you want to save your changes?"));
|
||||
msgBox.setDetailedText(tr("Differences here..."));
|
||||
msgBox.setStandardButtons(QMessageBox::Save
|
||||
| QMessageBox::Discard
|
||||
| QMessageBox::Cancel);
|
||||
msgBox.setDefaultButton(QMessageBox::Save);
|
||||
int ret = msgBox.exec();
|
||||
switch (ret)
|
||||
{
|
||||
case QMessageBox::Save:
|
||||
qDebug() << "Save document!";
|
||||
break;
|
||||
case QMessageBox::Discard:
|
||||
qDebug() << "Discard changes!";
|
||||
break;
|
||||
case QMessageBox::Cancel:
|
||||
qDebug() << "Close document!";
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "message_box_custom.moc"
|
||||
@@ -0,0 +1,47 @@
|
||||
// ============================================================================
|
||||
// message_box_question — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954535:10]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){ doDemo(); }
|
||||
private slots:
|
||||
void doDemo(){
|
||||
if (QMessageBox::Yes == QMessageBox::question(this,
|
||||
tr("Question"), tr("Are you OK?"),
|
||||
QMessageBox::Yes | QMessageBox::No,
|
||||
QMessageBox::Yes))
|
||||
{
|
||||
QMessageBox::information(this, tr("Hmmm..."),
|
||||
tr("I'm glad to hear that!"));
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::information(this, tr("Hmmm..."),
|
||||
tr("I'm sorry!"));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "message_box_question.moc"
|
||||
@@ -0,0 +1,36 @@
|
||||
// ============================================================================
|
||||
// modal_dialog — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954535:0]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QDialog>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){ doDemo(); }
|
||||
private slots:
|
||||
void doDemo(){
|
||||
QDialog dialog;
|
||||
dialog.setWindowTitle(tr("Hello, dialog!"));
|
||||
dialog.exec();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "modal_dialog.moc"
|
||||
@@ -0,0 +1,37 @@
|
||||
// ============================================================================
|
||||
// modeless_dialog_deleteonclose — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954535:3]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QDialog>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){ doDemo(); }
|
||||
private slots:
|
||||
void doDemo(){
|
||||
QDialog *dialog = new QDialog;
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
dialog->setWindowTitle(tr("Hello, dialog!"));
|
||||
dialog->show();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "modeless_dialog_deleteonclose.moc"
|
||||
@@ -0,0 +1,36 @@
|
||||
// ============================================================================
|
||||
// modeless_dialog_heap — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954535:2]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QDialog>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){ doDemo(); }
|
||||
private slots:
|
||||
void doDemo(){
|
||||
QDialog *dialog = new QDialog;
|
||||
dialog->setWindowTitle(tr("Hello, dialog!"));
|
||||
dialog->show();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "modeless_dialog_heap.moc"
|
||||
@@ -0,0 +1,36 @@
|
||||
// ============================================================================
|
||||
// modeless_dialog_stack — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954535:1]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QDialog>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){ doDemo(); }
|
||||
private slots:
|
||||
void doDemo(){
|
||||
QDialog dialog(this);
|
||||
dialog.setWindowTitle(tr("Hello, dialog!"));
|
||||
dialog.show();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "modeless_dialog_stack.moc"
|
||||
@@ -0,0 +1,27 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch08
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(label_text_create label_text_create.cpp)
|
||||
set_target_properties(label_text_create PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(label_text_create PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(label_text_create PRIVATE -Wall -Wextra)
|
||||
add_executable(label_text_html label_text_html.cpp)
|
||||
set_target_properties(label_text_html PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(label_text_html PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(label_text_html PRIVATE -Wall -Wextra)
|
||||
qt5_add_resources(RES label_pixmap.qrc)
|
||||
add_executable(label_pixmap label_pixmap.cpp ${RES})
|
||||
set_target_properties(label_pixmap PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(label_pixmap PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(label_pixmap PRIVATE -Wall -Wextra)
|
||||
qt5_add_resources(RES label_movie.qrc)
|
||||
add_executable(label_movie label_movie.cpp ${RES})
|
||||
set_target_properties(label_movie PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(label_movie PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(label_movie PRIVATE -Wall -Wextra)
|
||||
add_executable(custom_widget custom_widget.cpp)
|
||||
set_target_properties(custom_widget PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(custom_widget PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(custom_widget PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch08 DEPENDS label_text_create label_text_html label_pixmap label_movie custom_widget)
|
||||
@@ -0,0 +1,94 @@
|
||||
# p03/ch08 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `label_text_create` | `label_text_create.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh label_text_create` |
|
||||
| `label_text_html` | `label_text_html.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh label_text_html` |
|
||||
| `label_pixmap` | `label_pixmap.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh label_pixmap` |
|
||||
| `label_movie` | `label_movie.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh label_movie` |
|
||||
| `custom_widget` | `custom_widget.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh custom_widget` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 0] 显示文字 (普通文本、html)
|
||||
|
||||
```cpp
|
||||
voidsetText(const QString &)
|
||||
```
|
||||
|
||||
### [block 3] 显示图片
|
||||
|
||||
```cpp
|
||||
voidsetPixmap(const QPixmap &)
|
||||
```
|
||||
|
||||
### [block 4] 显示图片
|
||||
|
||||
```cpp
|
||||
QPixmap pixmap;
|
||||
```
|
||||
|
||||
### [block 5] 显示图片
|
||||
|
||||
```cpp
|
||||
pixmap.load(":/Image/boat.jpg");
|
||||
```
|
||||
|
||||
### [block 6] 显示图片
|
||||
|
||||
```cpp
|
||||
QLabel *label = new QLabel;
|
||||
label.setPixmap(pixmap);
|
||||
```
|
||||
|
||||
### [block 7] 显示动画
|
||||
|
||||
```cpp
|
||||
voidsetMovie(QMovie * movie)
|
||||
```
|
||||
|
||||
### [block 8] 显示动画
|
||||
|
||||
```cpp
|
||||
QMovie *movie = new QMovie(":/Mario.gif");
|
||||
```
|
||||
|
||||
### [block 9] 显示动画
|
||||
|
||||
```cpp
|
||||
movie->start();
|
||||
```
|
||||
|
||||
### [block 10] 显示动画
|
||||
|
||||
```cpp
|
||||
QLabel *label = new QLabel;
|
||||
label->setMovie(movie);
|
||||
```
|
||||
|
||||
### [block 11] 设置/获取内容
|
||||
|
||||
```cpp
|
||||
QStringtext() const
|
||||
```
|
||||
|
||||
### [block 12] 设置/获取内容
|
||||
|
||||
```cpp
|
||||
voidsetText(const QString &)
|
||||
```
|
||||
|
||||
### [block 13] 设置显示模式
|
||||
|
||||
```cpp
|
||||
voidsetEchoMode(EchoMode mode)
|
||||
```
|
||||
|
||||
### [block 14] 设置显示模式
|
||||
|
||||
```cpp
|
||||
void setTextMargins(int left, int top, int right, int bottom)
|
||||
```
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 179 B |
Binary file not shown.
|
After Width: | Height: | Size: 40 B |
@@ -0,0 +1,44 @@
|
||||
// ============================================================================
|
||||
// custom_widget — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954540:15]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QSpinBox>
|
||||
#include <QSlider>
|
||||
#include <QHBoxLayout>
|
||||
#include <QTimer>
|
||||
|
||||
// 自定义控件:spinbox 与 slider 联动
|
||||
class SmallWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SmallWidget(QWidget* parent = nullptr) : QWidget(parent) {
|
||||
QSpinBox* spin = new QSpinBox(this);
|
||||
QSlider* slider = new QSlider(Qt::Horizontal, this);
|
||||
QHBoxLayout* layout = new QHBoxLayout(this);
|
||||
layout->addWidget(spin);
|
||||
layout->addWidget(slider);
|
||||
// spin 变化 → slider 跟随(Qt5 静态转换选重载)
|
||||
connect(spin,
|
||||
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
slider, &QSlider::setValue);
|
||||
// slider 变化 → spin 跟随
|
||||
connect(slider, &QSlider::valueChanged, spin, &QSpinBox::setValue);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
SmallWidget w; w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "custom_widget.moc"
|
||||
@@ -0,0 +1,37 @@
|
||||
// ============================================================================
|
||||
// label_movie — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954540:movie]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QMovie>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget() {
|
||||
QMovie* movie = new QMovie(":/Mario.gif"); // 从资源加载动画
|
||||
movie->start();
|
||||
QLabel* label = new QLabel(this);
|
||||
label->setMovie(movie);
|
||||
label->setGeometry(10, 10, 200, 200);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "label_movie.moc"
|
||||
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file alias="//Mario.gif">assets/mario.gif</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -0,0 +1,37 @@
|
||||
// ============================================================================
|
||||
// label_pixmap — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954540:img]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QPixmap>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget() {
|
||||
QPixmap pixmap;
|
||||
pixmap.load(":/Image/boat.jpg"); // 从资源加载图片
|
||||
QLabel* label = new QLabel(this);
|
||||
label->setPixmap(pixmap); // 注意:label 是指针,用 ->
|
||||
label->setGeometry(10, 10, 200, 120);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "label_pixmap.moc"
|
||||
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file alias="/Image/boat.jpg">assets/image_boat.jpg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -0,0 +1,33 @@
|
||||
// ============================================================================
|
||||
// label_text_create — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954540:1]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){
|
||||
QLabel *label = new QLabel;
|
||||
label->setText("Hello, World!");
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "label_text_create.moc"
|
||||
@@ -0,0 +1,35 @@
|
||||
// ============================================================================
|
||||
// label_text_html — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954540:2]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QTimer>
|
||||
|
||||
class DemoWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DemoWidget(){
|
||||
QLabel * label = new QLabel(this);
|
||||
label ->setText("Hello, World");
|
||||
label ->setText("<h1><a href=\"https://www.baidu.com\">百度一下</a></h1>");
|
||||
label ->setOpenExternalLinks(true);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
DemoWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "label_text_html.moc"
|
||||
@@ -0,0 +1,17 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch09
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(mouse_event mouse_event.cpp)
|
||||
set_target_properties(mouse_event PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(mouse_event PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(mouse_event PRIVATE -Wall -Wextra)
|
||||
add_executable(event_override_customwidget event_override_customwidget.cpp)
|
||||
set_target_properties(event_override_customwidget PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(event_override_customwidget PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(event_override_customwidget PRIVATE -Wall -Wextra)
|
||||
add_executable(event_filter_mainwindow event_filter_mainwindow.cpp)
|
||||
set_target_properties(event_filter_mainwindow PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(event_filter_mainwindow PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(event_filter_mainwindow PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch09 DEPENDS mouse_event event_override_customwidget event_filter_mainwindow)
|
||||
@@ -0,0 +1,136 @@
|
||||
# p03/ch09 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `mouse_event` | `mouse_event.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh mouse_event` |
|
||||
| `event_override_customwidget` | `event_override_customwidget.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh event_override_customwidget` |
|
||||
| `event_filter_mainwindow` | `event_filter_mainwindow.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh event_filter_mainwindow` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 1] .1 事件
|
||||
|
||||
```cpp
|
||||
label->setMouseTracking(true);
|
||||
```
|
||||
|
||||
### [block 3] .2 event()
|
||||
|
||||
```cpp
|
||||
bool CustomTextEdit::event(QEvent *e)
|
||||
{
|
||||
if (e->type() == QEvent::KeyPress)
|
||||
{
|
||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
|
||||
if (keyEvent->key() == Qt::Key_Tab)
|
||||
{
|
||||
qDebug() << "You press tab.";
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
```
|
||||
|
||||
### [block 4] .2 event()
|
||||
|
||||
```cpp
|
||||
switch (event->type()) {
|
||||
case QEvent::MouseMove:
|
||||
mouseMoveEvent((QMouseEvent*)event);
|
||||
break;
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### [block 5] .2 event()
|
||||
|
||||
```cpp
|
||||
//!!! Qt5
|
||||
bool QObject::event(QEvent *e)
|
||||
{
|
||||
switch (e->type()) {
|
||||
case QEvent::Timer:
|
||||
timerEvent((QTimerEvent*)e);
|
||||
break;
|
||||
case QEvent::ChildAdded:
|
||||
case QEvent::ChildPolished:
|
||||
case QEvent::ChildRemoved:
|
||||
childEvent((QChildEvent*)e);
|
||||
break;
|
||||
// ...
|
||||
default:
|
||||
if (e->type() >= QEvent::User) {
|
||||
customEvent(e);
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
### [block 7] .3 事件过滤器
|
||||
|
||||
```cpp
|
||||
bool CustomWidget::event(QEvent *e)
|
||||
{
|
||||
if (e->type() == QEvent::KeyPress) {
|
||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
|
||||
if (keyEvent->key() == Qt::Key_Tab) {
|
||||
qDebug() << "You press tab.";
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return QWidget::event(e);
|
||||
}
|
||||
现在,我们可以给出一个使用事件过滤器的版本:
|
||||
bool FilterObject::eventFilter(QObject *object, QEvent *event)
|
||||
{
|
||||
if (object == target && event->type() == QEvent::KeyPress)
|
||||
{
|
||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
||||
if (keyEvent->key() == Qt::Key_Tab) {
|
||||
qDebug() << "You press tab.";
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
```
|
||||
|
||||
### [block 8] .4 总结
|
||||
|
||||
```cpp
|
||||
LRESULT CALLBACK WndProc(HWND hWnd,
|
||||
UINT message,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
```
|
||||
|
||||
### [block 9] .4 总结
|
||||
|
||||
```cpp
|
||||
switch(message)
|
||||
{
|
||||
case WM_PAINT:
|
||||
// ...
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
// ...
|
||||
break;
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### [block 10] .4 总结
|
||||
|
||||
```cpp
|
||||
virtual bool QCoreApplication::notify ( QObject * receiver,
|
||||
QEvent * event );
|
||||
```
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
// ============================================================================
|
||||
// event_filter_mainwindow — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954546:6]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QMainWindow>
|
||||
#include <QLabel>
|
||||
#include <QEvent>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
// 事件过滤器:拦截 label 上的事件
|
||||
class MainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
public:
|
||||
MainWindow() {
|
||||
label = new QLabel(QStringLiteral("事件过滤器示例"), this);
|
||||
label->setGeometry(10, 30, 200, 30);
|
||||
label->installEventFilter(this); // 给 label 安装事件过滤器
|
||||
}
|
||||
protected:
|
||||
bool eventFilter(QObject* watched, QEvent* event) override {
|
||||
if (watched == label && event->type() == QEvent::MouseButtonPress) {
|
||||
qDebug() << "label 上的鼠标按下事件被过滤器拦截";
|
||||
return true; // 拦截,不再派发
|
||||
}
|
||||
return QMainWindow::eventFilter(watched, event);
|
||||
}
|
||||
private:
|
||||
QLabel* label;
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
MainWindow w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "event_filter_mainwindow.moc"
|
||||
@@ -0,0 +1,43 @@
|
||||
// ============================================================================
|
||||
// event_override_customwidget — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954546:2]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QEvent>
|
||||
#include <QKeyEvent>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
class CustomWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CustomWidget(QWidget* p = nullptr) : QWidget(p) {}
|
||||
protected:
|
||||
bool event(QEvent* e) override {
|
||||
if (e->type() == QEvent::KeyPress) {
|
||||
QKeyEvent* ke = static_cast<QKeyEvent*>(e);
|
||||
if (ke->key() == Qt::Key_Tab) {
|
||||
qDebug() << "Tab pressed in CustomWidget";
|
||||
return true; // 事件已处理,不再向上传递
|
||||
}
|
||||
}
|
||||
return QWidget::event(e); // 其余交给基类
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
CustomWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "event_override_customwidget.moc"
|
||||
@@ -0,0 +1,49 @@
|
||||
// ============================================================================
|
||||
// mouse_event — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954546:0]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QMouseEvent>
|
||||
#include <QString>
|
||||
#include <QTimer>
|
||||
|
||||
// 自定义 QLabel:重写鼠标事件,显示坐标
|
||||
class EventLabel : public QLabel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit EventLabel(QWidget* p = nullptr) : QLabel(p) {
|
||||
setMouseTracking(true); // 启用鼠标移动追踪(默认只在按键时追踪)
|
||||
setText(QStringLiteral("移动鼠标到这里"));
|
||||
}
|
||||
protected:
|
||||
void mouseMoveEvent(QMouseEvent* event) override {
|
||||
setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
|
||||
.arg(event->x()).arg(event->y()));
|
||||
}
|
||||
void mousePressEvent(QMouseEvent* event) override {
|
||||
setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
|
||||
.arg(event->x()).arg(event->y()));
|
||||
}
|
||||
void mouseReleaseEvent(QMouseEvent* event) override {
|
||||
setText(QString("<center><h1>Release: (%1, %2)</h1></center>")
|
||||
.arg(event->x()).arg(event->y()));
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
EventLabel w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "mouse_event.moc"
|
||||
@@ -0,0 +1,22 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch10
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(qpainter_basic qpainter_basic.cpp)
|
||||
set_target_properties(qpainter_basic PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(qpainter_basic PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(qpainter_basic PRIVATE -Wall -Wextra)
|
||||
qt5_add_resources(RES paint_device_pixmaps.qrc)
|
||||
add_executable(paint_device_pixmaps paint_device_pixmaps.cpp ${RES})
|
||||
set_target_properties(paint_device_pixmaps PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(paint_device_pixmaps PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(paint_device_pixmaps PRIVATE -Wall -Wextra)
|
||||
add_executable(paint_device_qimage paint_device_qimage.cpp)
|
||||
set_target_properties(paint_device_qimage PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(paint_device_qimage PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(paint_device_qimage PRIVATE -Wall -Wextra)
|
||||
add_executable(qpicture_io qpicture_io.cpp)
|
||||
set_target_properties(qpicture_io PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(qpicture_io PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(qpicture_io PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch10 DEPENDS qpainter_basic paint_device_pixmaps paint_device_qimage qpicture_io)
|
||||
@@ -0,0 +1,34 @@
|
||||
# p03/ch10 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `qpainter_basic` | `qpainter_basic.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh qpainter_basic` |
|
||||
| `paint_device_pixmaps` | `paint_device_pixmaps.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh paint_device_pixmaps` |
|
||||
| `paint_device_qimage` | `paint_device_qimage.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh paint_device_qimage` |
|
||||
| `qpicture_io` | `qpicture_io.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh qpicture_io` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 1] .1 QPainter
|
||||
|
||||
```cpp
|
||||
PaintedWidget::PaintedWidget(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
{
|
||||
resize(800, 600);
|
||||
setWindowTitle(tr("Paint Demo"));
|
||||
}
|
||||
void PaintedWidget::paintEvent(QPaintEvent *)
|
||||
{
|
||||
QPainter painter(this);
|
||||
painter.drawLine(80, 100, 650, 500);
|
||||
painter.setPen(Qt::red);
|
||||
painter.drawRect(10, 10, 100, 400);
|
||||
painter.setPen(QPen(Qt::green, 5));
|
||||
painter.setBrush(Qt::blue);
|
||||
painter.drawEllipse(50, 150, 400, 200);
|
||||
}
|
||||
```
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 179 B |
Binary file not shown.
|
After Width: | Height: | Size: 179 B |
@@ -0,0 +1,44 @@
|
||||
// ============================================================================
|
||||
// paint_device_pixmaps — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954548:2]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPainter>
|
||||
#include <QPaintEvent>
|
||||
#include <QPixmap>
|
||||
#include <QBitmap>
|
||||
#include <QTimer>
|
||||
|
||||
class PaintWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
PaintWidget(QWidget* parent = nullptr) : QWidget(parent) { setFixedSize(360, 200); }
|
||||
protected:
|
||||
void paintEvent(QPaintEvent*) override {
|
||||
QPainter painter(this);
|
||||
QPixmap pix(":/Image/butterfly.png"); // 从资源加载图片
|
||||
painter.drawPixmap(10, 10, pix);
|
||||
QPixmap pix1(":/Image/butterfly1.png");
|
||||
painter.drawPixmap(180, 10, pix1);
|
||||
// QBitmap 是 QPixmap 子类,仅 1 位深度(黑白掩码)
|
||||
QBitmap bmp = pix.mask();
|
||||
painter.drawPixmap(10, 110, bmp);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
PaintWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "paint_device_pixmaps.moc"
|
||||
@@ -0,0 +1,6 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file alias="/Image/butterfly.png">assets/image_butterfly.png</file>
|
||||
<file alias="/Image/butterfly1.png">assets/image_butterfly1.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -0,0 +1,44 @@
|
||||
// ============================================================================
|
||||
// paint_device_qimage — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954548:3]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPainter>
|
||||
#include <QPaintEvent>
|
||||
#include <QImage>
|
||||
#include <QTimer>
|
||||
|
||||
class PaintWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
PaintWidget(QWidget* parent = nullptr) : QWidget(parent) { setFixedSize(200, 200); }
|
||||
protected:
|
||||
void paintEvent(QPaintEvent*) override {
|
||||
QPainter painter(this);
|
||||
QImage image(100, 100, QImage::Format_RGB32);
|
||||
// QImage 可直接逐像素操作(QPixmap 不行)
|
||||
for (int y = 0; y < image.height(); ++y) {
|
||||
for (int x = 0; x < image.width(); ++x) {
|
||||
image.setPixel(x, y, qRgb((x * 2) % 256, (y * 2) % 256, 128));
|
||||
}
|
||||
}
|
||||
painter.drawImage(10, 10, image);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
PaintWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "paint_device_qimage.moc"
|
||||
@@ -0,0 +1,40 @@
|
||||
// ============================================================================
|
||||
// qpainter_basic — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954548:0]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPainter>
|
||||
#include <QPaintEvent>
|
||||
#include <QTimer>
|
||||
|
||||
class PaintedWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
PaintedWidget(QWidget* parent = nullptr) : QWidget(parent) {
|
||||
setFixedSize(300, 200);
|
||||
}
|
||||
protected:
|
||||
void paintEvent(QPaintEvent*) override {
|
||||
QPainter painter(this);
|
||||
painter.drawLine(QLine(10, 10, 200, 10)); // 画线
|
||||
painter.drawRect(QRect(10, 30, 100, 50)); // 画矩形
|
||||
painter.drawEllipse(QRect(150, 30, 100, 80)); // 画椭圆
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
PaintedWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "qpainter_basic.moc"
|
||||
@@ -0,0 +1,49 @@
|
||||
// ============================================================================
|
||||
// qpicture_io — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954548:4]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPainter>
|
||||
#include <QPaintEvent>
|
||||
#include <QPicture>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
class PaintWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
PaintWidget(QWidget* parent = nullptr) : QWidget(parent) { setFixedSize(200, 200); }
|
||||
protected:
|
||||
void paintEvent(QPaintEvent*) override {
|
||||
// QPicture 记录并回放绘图指令
|
||||
QPicture picture;
|
||||
QPainter painter;
|
||||
painter.begin(&picture); // 把绘图记录到 picture
|
||||
painter.drawLine(10, 10, 100, 100);
|
||||
painter.end();
|
||||
picture.save("drawing.pic"); // 保存(用相对路径,跨平台)
|
||||
|
||||
QPicture picture2;
|
||||
picture2.load("drawing.pic"); // 回放
|
||||
QPainter p2(this);
|
||||
p2.drawPicture(10, 10, picture2);
|
||||
qDebug() << "QPicture saved & replayed";
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
PaintWidget w;
|
||||
w.show();
|
||||
// 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)
|
||||
QTimer::singleShot(200, &app, &QApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
#include "qpicture_io.moc"
|
||||
@@ -0,0 +1,17 @@
|
||||
# Auto-generated by tools/gen_part3.py — do not edit by hand.
|
||||
# 章节:p03/ch11
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
add_executable(qfile_basic qfile_basic.cpp)
|
||||
set_target_properties(qfile_basic PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(qfile_basic PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(qfile_basic PRIVATE -Wall -Wextra)
|
||||
add_executable(qdatastream_io qdatastream_io.cpp)
|
||||
set_target_properties(qdatastream_io PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(qdatastream_io PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(qdatastream_io PRIVATE -Wall -Wextra)
|
||||
add_executable(qtextstream_io qtextstream_io.cpp)
|
||||
set_target_properties(qtextstream_io PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
|
||||
target_link_libraries(qtextstream_io PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
target_compile_options(qtextstream_io PRIVATE -Wall -Wextra)
|
||||
add_custom_target(all_p03_ch11 DEPENDS qfile_basic qdatastream_io qtextstream_io)
|
||||
@@ -0,0 +1,77 @@
|
||||
# p03/ch11 — Qt 示例
|
||||
|
||||
## 可运行示例
|
||||
|
||||
| 目标 | 源文件 | 说明 |
|
||||
|---|---|---|
|
||||
| `qfile_basic` | `qfile_basic.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh qfile_basic` |
|
||||
| `qdatastream_io` | `qdatastream_io.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh qdatastream_io` |
|
||||
| `qtextstream_io` | `qtextstream_io.cpp` | 构建运行见顶层 README;离屏验证 `QT_QPA_PLATFORM=offscreen tools/run_qt.sh qtextstream_io` |
|
||||
|
||||
## 参考片段(签名/伪代码,未单独建目标)
|
||||
|
||||
### [block 1] .1 基本文件操作
|
||||
|
||||
```cpp
|
||||
QFileInfo fi("/tmp/archive.tar.gz");
|
||||
QString base = fi.baseName(); // base = "archive"
|
||||
QString base = fi.completeBaseName(); // base = "archive.tar"
|
||||
QString ext = fi.suffix(); // ext = "gz"
|
||||
QString ext = fi.completeSuffix(); // ext = "tar.gz"
|
||||
```
|
||||
|
||||
### [block 2] .2 二进制文件读写
|
||||
|
||||
```cpp
|
||||
QFile file("file.dat");
|
||||
file.open(QIODevice::WriteOnly);
|
||||
QDataStream out(&file);
|
||||
out << QString("the answer is");
|
||||
out << (qint32)42;
|
||||
```
|
||||
|
||||
### [block 3] .2 二进制文件读写
|
||||
|
||||
```cpp
|
||||
QFile file("file.dat");
|
||||
file.open(QIODevice::ReadOnly);
|
||||
QDataStream in(&file);
|
||||
QString str;
|
||||
qint32 a;
|
||||
in >> str >> a;
|
||||
```
|
||||
|
||||
### [block 4] .2 二进制文件读写
|
||||
|
||||
```cpp
|
||||
QFile file("file.dat");
|
||||
file.open(QIODevice::ReadWrite);
|
||||
QDataStream stream(&file);
|
||||
QString str = "the answer is 42";
|
||||
stream << str;
|
||||
```
|
||||
|
||||
### [block 5] .3 文本文件读写
|
||||
|
||||
```cpp
|
||||
QFile data("file.txt");
|
||||
if (data.open(QFile::WriteOnly | QIODevice::Truncate))
|
||||
{
|
||||
QTextStream out(&data);
|
||||
out << "The answer is " << 42;
|
||||
}
|
||||
```
|
||||
|
||||
### [block 6] .3 文本文件读写
|
||||
|
||||
```cpp
|
||||
QFile data("file.txt");
|
||||
if (data.open(QFile::ReadOnly))
|
||||
{
|
||||
QTextStream in(&data);
|
||||
QString str;
|
||||
int ans = 0;
|
||||
in >> str >> ans;
|
||||
}
|
||||
```
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
// ============================================================================
|
||||
// qdatastream_io — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954552:data]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QFile>
|
||||
#include <QDataStream>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
// 二进制文件读写:先写 file.dat,再读回
|
||||
int main(int argc, char* argv[]) {
|
||||
QCoreApplication app(argc, argv);
|
||||
|
||||
// ---- 写 ----
|
||||
{
|
||||
QFile file("file.dat");
|
||||
if (file.open(QIODevice::WriteOnly)) {
|
||||
QDataStream out(&file);
|
||||
out << QString("hello") << qint32(42) << 3.14;
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
// ---- 读 ----
|
||||
{
|
||||
QFile file("file.dat");
|
||||
if (file.open(QIODevice::ReadOnly)) {
|
||||
QDataStream in(&file);
|
||||
QString s; qint32 n; double d;
|
||||
in >> s >> n >> d;
|
||||
qDebug() << "read:" << s << n << d;
|
||||
file.close();
|
||||
} else {
|
||||
qDebug() << "open failed";
|
||||
}
|
||||
}
|
||||
|
||||
QTimer::singleShot(0, &app, &QCoreApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
// ============================================================================
|
||||
// qfile_basic — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954552:0]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QDebug>
|
||||
#include <QIODevice>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QCoreApplication app(argc, argv);
|
||||
|
||||
QFile file("in.txt");
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
qDebug() << "Open file failed.";
|
||||
return -1;
|
||||
}
|
||||
while (!file.atEnd()) {
|
||||
qDebug() << file.readLine();
|
||||
}
|
||||
|
||||
QFileInfo info(file);
|
||||
qDebug() << "isDir:" << info.isDir();
|
||||
qDebug() << "isExecutable:" << info.isExecutable();
|
||||
qDebug() << "baseName:" << info.baseName();
|
||||
qDebug() << "completeBaseName:" << info.completeBaseName();
|
||||
qDebug() << "suffix:" << info.suffix();
|
||||
qDebug() << "completeSuffix:" << info.completeSuffix();
|
||||
|
||||
return 0; // 文件 IO 完成,直接退出(无需 app.exec() 事件循环)
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
// ============================================================================
|
||||
// qtextstream_io — Qt 桌面示例
|
||||
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
|
||||
// 原文片段:[58954552:text]
|
||||
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
|
||||
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
|
||||
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>
|
||||
// ============================================================================
|
||||
|
||||
#include <QApplication>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
// 文本文件读写:先写 file.txt,再读回
|
||||
int main(int argc, char* argv[]) {
|
||||
QCoreApplication app(argc, argv);
|
||||
|
||||
// ---- 写 ----
|
||||
{
|
||||
QFile data("file.txt");
|
||||
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
|
||||
QTextStream out(&data);
|
||||
out << "line1: hello" << endl;
|
||||
out << "line2: world" << endl;
|
||||
data.close();
|
||||
}
|
||||
}
|
||||
// ---- 读 ----
|
||||
{
|
||||
QFile data("file.txt");
|
||||
if (data.open(QFile::ReadOnly)) {
|
||||
QTextStream in(&data);
|
||||
QString line;
|
||||
while (in.readLineInto(&line)) {
|
||||
qDebug() << "read:" << line;
|
||||
}
|
||||
data.close();
|
||||
}
|
||||
}
|
||||
|
||||
QTimer::singleShot(0, &app, &QCoreApplication::quit);
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
line1: hello
|
||||
line2: world
|
||||
@@ -0,0 +1 @@
|
||||
Hello from in.txt
|
||||
Reference in New Issue
Block a user