QT5 QML C++高级扩展开发视频课程全套教程资源分享

封面图

📖 资源简介

今天分享一套QT5 QML C++高级扩展开发视频课程的课程资源,内容挺系统的,适合想认真学习的同学。

✨ 资源亮点

  • 内容扎实:100节视频课程,跟着老师一步步操作,比自学摸索快得多。

📚 课程内容

资源清单

类型 数量
视频教程 100 节
压缩文件 0 个
合计 100

🧩 Qt / QML 核心技术精讲

Qt 是一套跨平台 C++ 应用开发框架,既能用原生 Widgets 写传统桌面软件,也能用 QML 写现代、流畅、动画丰富的 UI。这套 100 节课程覆盖了”Qt 基础 → Widgets → QML → C++ 与 QML 混合编程 → 网络 → 多线程 → 打包部署”的完整链路。下面把关键知识点梳理一遍。

一、信号与槽:Qt 的灵魂

信号与槽(Signal/Slot)是 Qt 对象间通信的机制,取代了传统回调。对象发出 signal,任意接收者用 slot 函数响应,两者通过 connect 连接,类型安全且解耦:

// 新式函数指针语法,编译期检查类型
connect(sender, &QPushButton::clicked, receiver, &MyWindow::onClick);

// 也可直接接 lambda
connect(button, &QPushButton::clicked, this, [=]() {
    qDebug() << "按钮被点击";
});

信号槽建立在元对象系统(MOC)之上:任何要使用信号槽、属性、Q_INVOKABLE 的类都必须继承 QObject 并在类声明开头写 Q_OBJECT 宏,由 MOC 预处理器生成元对象代码。另外,Qt 的对象树与父子机制会自动管理内存——QObject 子对象在父对象析构时自动 delete,所以你 new 出来的控件只要挂上父对象,就不用手动释放。

二、Qt Widgets 与布局

Widgets 是传统桌面控件库。布局管理器让控件随窗口缩放自动排版,比手算坐标健壮得多:

auto *layout = new QVBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->setContentsMargins(10, 10, 10, 10);
setLayout(layout);

QHBoxLayout 横向、QVBoxLayout 纵向、QGridLayout 网格;QMainWindow 提供菜单栏、工具栏、状态栏、中心部件的标准骨架,是写桌面应用的起点。

三、QML:声明式 UI 语言

QML 是声明式、 JSON 风格的 UI 描述语言,天然支持属性绑定与动画。属性绑定是它最强大的特性——一个属性的值会自动随依赖更新而重新计算:

import QtQuick 2.15
import QtQuick.Controls 2.15

Column {
    spacing: 8
    width: 300

    Text {
        id: counter
        text: count + " 次"   // 属性绑定:count 一变,文字自动更新
    }

    Button {
        text: qsTr("点我")
        property int count: 0
        onClicked: counter.count++   // 信号处理器 onXxx
    }

    ListView {
        width: parent.width
        height: 200
        model: myModel              // 绑定 C++ 侧模型
        delegate: Text { text: name }
    }
}

Repeater / ListView / GridView 负责列表展示,State / Transition 描述状态切换动画,Loader 与动态 Component.createObject() 实现按需加载界面。

四、C++ 与 QML 交互:混合编程的关键

这是”高级扩展开发”的核心。让 QML 调用 C++,有两条路:注册类型,或注入上下文对象。

// myobject.h
class MyObject : public QObject {
    Q_OBJECT
    // 把属性暴露给 QML,可读可写可通知
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
public:
    explicit MyObject(QObject *parent = nullptr) : QObject(parent) {}

    QString name() const { return m_name; }
    void setName(const QString &v) {
        if (m_name != v) { m_name = v; emit nameChanged(); }
    }

    Q_INVOKABLE void doWork();   // 标记后 QML 可直接调用
signals:
    void nameChanged();
private:
    QString m_name;
};
// main.cpp:注册类型 + 注入上下文属性
qmlRegisterType<MyObject>("com.demo", 1, 0, "MyObject");
// 或直接把现成对象塞进上下文
engine.rootContext()->setContextProperty("manager", &manager);

QML 侧就能 import com.demo 1.0 并使用 MyObject { },或直接调用 manager.doWork()。C++ 发信号,QML 用 onNameChanged: 响应,双向通信就打通了。

五、模型/视图架构

列表数据来自 C++ 时,应继承 QAbstractListModel,重写 rowCount() / data(),并通过 roleNames() 把角色名暴露给 QML:

QHash<int, QByteArray> MyModel::roleNames() const {
    return { {Qt::UserRole + 1, "name"}, {Qt::UserRole + 2, "age"} };
}

数据变化时发 beginInsertRows / endInsertRows 或 dataChanged 信号,视图会自动刷新,不要直接改 QML 里的数据。

六、网络与多线程

网络用 QNetworkAccessManager 发请求,异步、信号驱动:

auto *mgr = new QNetworkAccessManager(this);
QNetworkReply *reply = mgr->get(QNetworkRequest(QUrl("https://api.example.com/data")));
connect(reply, &QNetworkReply::finished, this, [=]() {
    const QByteArray body = reply->readAll();
    qDebug() << body;
    reply->deleteLater();
});

多线程的正确姿势是 worker.moveToThread(),而不是子类化 QThread 重写 run():

Worker *worker = new Worker;
auto *thread = new QThread;
worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &Worker::process);
connect(worker, &Worker::finished, thread, &QThread::quit);
connect(thread, &QThread::finished, worker, &QObject::deleteLater);
thread->start();

线程间通信用信号槽自动排队连接,避免手动加锁。QtConcurrent 适合一次性并行任务,QThreadPool + QRunnable 适合复用线程池。

七、打包部署

Windows 下用 windeployqt 工具把依赖的 Qt 动态库、插件、平台目录自动拷贝到可执行文件旁边:

windeployqt.exe yourapp.exe

需要更少依赖、单文件分发时再考虑静态编译(注意 LGPL 协议约束)。

八、事件处理与定时器

Qt 的事件系统是另一套机制,与信号槽互补。每个 QObject 都有 event() 函数分发事件,重写它或安装事件过滤器可以在事件到达目标前拦截:

// 事件过滤器:在不修改目标类的情况下统一拦截事件
bool FilterObject::eventFilter(QObject *watched, QEvent *event) {
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *key = static_cast<QKeyEvent *>(event);
        qDebug() << "按下了" << key->key();
        return true; // 拦截,不再继续传播
    }
    return QObject::eventFilter(watched, event);
}
// 安装:target->installEventFilter(filterObj);

定时器用 QTimer,start() 后周期性发 timeout() 信号,或用单次 QTimer::singleShot(1000, ...) 做延时任务,比手写 sleep 更符合事件循环。

九、QML 动画与画布

QML 的动画声明式地挂在属性上,状态切换自动补间:

Rectangle {
    width: 100; height: 100; color: "teal"
    states: State { name: "moved"; PropertyChanges { x: 200 } }
    transitions: Transition {
        NumberAnimation { property: "x"; duration: 300; easing.type: Easing.OutQuad }
    }
    MouseArea { anchors.fill: parent; onClicked: parent.state = "moved" }
}

需要自绘图形时用 Canvas(类似 HTML5 Canvas 的 2D 绘制),需要 GPU 着色器特效时用 ShaderEffect 挂 GLSL 片段着色器。

常见问题 FAQ

  • Q:为什么 QML 里改了 C++ 属性,界面不更新? 因为 Q_PROPERTY 没发 NOTIFY 信号。属性变化必须 emit 对应的通知信号,QML 的属性绑定才会重新求值。
  • Q:子线程能直接操作 UI 吗? 不能。Qt 规定 UI 只能在主线程操作,跨线程更新 UI 一律走信号槽(自动排队连接)。
  • Q:connect 第五个参数什么时候要指定? 跨线程时默认自动用 Qt::QueuedConnection;同线程想强制排队才显式指定。

十、TCP / UDP 套接字

除了 HTTP 接口,Qt 也提供底层套接字:QTcpSocket 做流式 TCP 连接,QUdpSocket 做无连接的 UDP 广播。两者都是异步的——数据到达时发 readyRead() 信号,在槽函数里 readAll() 读取,配合 QTcpServer 的 newConnection() 信号即可搭一个 TCP 服务端:

// TCP 客户端示例
auto *socket = new QTcpSocket(this);
socket->connectToHost("127.0.0.1", 8080);
connect(socket, &QTcpSocket::readyRead, this, [=]() {
    qDebug() << "收到:" << socket->readAll();
});

注意 TCP 是字节流,粘包/拆包要自己处理——通常在应用层加包头长度或用换行符分包;UDP 保留边界但可能丢包,按场景选型。

十一、对象树与内存:为什么少 new 也能不泄漏

Qt 的内存管理和普通 C++ 最大的不同是父子对象树:在 QObject 构造时传入 parent,它就会被挂到父对象的 children 列表里;父对象析构时会自动 delete 所有子对象。所以只要控件树、对象树挂对了父对象,绝大多数对象根本不需要手动 delete。真正要小心的是”没有 parent 的裸 new”(如纯数据对象)和 moveToThread 后的生命周期,这两类才是 Qt 项目内存泄漏的高发区。

学习路线建议

  1. 先用 Widgets 把”信号槽、布局、QMainWindow、事件处理”这些 Qt 核心概念吃透——这是地基;
  2. 再转 QML,重点理解属性绑定和声明式思维,这是 QML 与命令式 C++ 最大的思维差异;
  3. 攻克 C++ 与 QML 交互(Q_PROPERTY / Q_INVOKABLE / 模型视图),这是做”高级扩展”的分水岭;
  4. 最后补网络、多线程、打包部署,形成能独立交付一个完整桌面/嵌入式应用的能力。

总结

Qt 的价值在于”一套 C++ 代码跨平台跑桌面、移动端、嵌入式”,QML 又补上了现代 UI 表现力。这套 100 节课程从基础一路讲到 C++ 扩展开发,适合有一定 C++ 基础、想进入跨平台桌面/嵌入式领域的同学。建议边看边把每个知识点在自己的小 demo 里跑一遍,尤其是信号槽与 QML 交互这两块,光看不动手很容易”以为会了”。

资源获取

💡 建议:尽快保存到本地网盘或电脑,避免分享链接后期失效。


整理不易,如果对你有帮助,欢迎分享给更多需要的朋友。

QT5 QML C++高级扩展开发视频课程全套教程资源分享-速优课
QT5 QML C++高级扩展开发视频课程全套教程资源分享
此内容为付费阅读,请付费后查看
¥2
立即购买
您当前未登录!建议登陆后购买,可保存购买订单
付费阅读
© 版权声明
THE END
喜欢就支持一下吧
点赞13
相关推荐
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容

温馨提示:
1、本内容转载于网络,版权归原作者所有!
2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!