Qt6学习入门——环境搭建
简介
Qt6 是 Qt 框架的最新主要版本,是一个跨平台的 C++ 应用程序开发框架,用于创建图形用户界面和跨平台应用程序。
我们使用的Qt6 是免费的开源版本。
关于 Qt 许可证
通过 pacman 安装的 Qt6 是 LGPLv3 许可证的开源版本,具有以下特点:
✅ 允许的使用:
使用 - 完全免费
使用 - 可以用于商业软件开发
开源项目 - 可以用于 GPL/LGPL 项目
链接 只要动态链接 Qt 库,可以闭源分发
限制(仅针对静态链接):
如果要静态链接 Qt 库并闭源分发,需要购买商业许可证
但对于动态链接,即使是商业软件也完全免费.
跨平台支持
桌面端: Windows, Linux, macOS
移动端: Android, iOS
嵌入式系统: 各种嵌入式设备
Web: WebAssembly 支持
主要模块
核心模块
| 模块 | 功能描述 |
|---|---|
| QtCore | 核心非 GUI 功能 |
| QtGui | 图形界面基础 |
| QtWidgets | UI 控件库 |
| QtQml | QML 语言支持 |
| QtQuick | 现代 UI 框架 |
扩展模块
| 模块 | 功能描述 |
|---|---|
| QtNetwork | 网络编程 |
| QtSql | 数据库操作 |
| QtMultimedia | 多媒体处理 |
| QtWebEngine | 网页渲染 |
总结下来,非常简单,和Android开发一样,学习UI组件、网络、数据库、音视频、WebView等。
Hello World
安装命令
pacman -S mingw-w64-ucrt-x86_64-qt6
cmake
cmake_minimum_required(VERSION 3.10.0)
project(qt_learn01 VERSION 0.1.0 LANGUAGES C CXX)# ✅ 设置 C++ 标准
set(CMAKE_CXX_STANDARD 26)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用指定标准
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器扩展(使用纯标准)# 查找源文件
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS"src/*.cpp""src/*.c"
)add_executable(qt_learn01 main.cpp ${SOURCES})target_include_directories(${CMAKE_PROJECT_NAME}PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/learn01
)# ✅ 查找 Qt6
find_package(Qt6 REQUIRED COMPONENTS Widgets)
# ✅ 链接 Qt6 库
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets)include(CTest)
enable_testing()set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
代码
#include <learn001.hpp>
#include <QApplication>
#include <QPushButton>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QLabel>void handleClick(){std::cout << "Button Clicked!\n";QMessageBox::information(nullptr, "Hello", "Clicked the Button");
}int main(int, char**){QApplication app(__argc, __argv);QPushButton button("Hello World Qt6");button.resize(200, 60);button.show();QObject::connect(&button, &QPushButton::clicked, handleClick);return app.exec();
}
网络和数据库
cmake_minimum_required(VERSION 3.10.0)
project(qt_learn01 VERSION 0.1.0 LANGUAGES C CXX)# ✅ 设置 C++ 标准
set(CMAKE_CXX_STANDARD 26)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用指定标准
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器扩展(使用纯标准)# 查找源文件
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS"src/*.cpp""src/*.c"
)add_executable(qt_learn01 main.cpp ${SOURCES})target_include_directories(${CMAKE_PROJECT_NAME}PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/learn01
)# ✅ 查找 Qt6
find_package(Qt6 REQUIRED COMPONENTS Widgets Network Sql)
# ✅ 链接 Qt6 库
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets Qt6::Network Qt6::Sql)include(CTest)
enable_testing()set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
源码
#include <learn001.hpp>
#include <QApplication>
#include <QPushButton>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QObject>#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>void handleClick(){std::cout << "Button Clicked!\n";QMessageBox::information(nullptr, "Hello", "Clicked the Button");
}
bool initDatabase() {// ✅ 连接 SQLite 数据库(内存模式,也可以是文件路径)QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// db.setDatabaseName(":memory:"); // 或 "test.db"db.setDatabaseName("test.db"); // 或 "test.db"if (!db.open()) {qDebug() << "Failed to open database:" << db.lastError().text();return false;}QSqlQuery query;// ✅ 创建表if (!query.exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);")) {qDebug() << "Create table failed:" << query.lastError().text();return false;}// ✅ 插入数据query.exec("INSERT INTO users (name) VALUES ('Alice');");query.exec("INSERT INTO users (name) VALUES ('Bob');");// ✅ 查询数据query.exec("SELECT id, name FROM users;");while (query.next()) {int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "User:" << id << name;}return true;
}
int main(int argc, char *argv[]){// QApplication app(__argc, __argv);// QPushButton button("Fetch Data from https://example.com");// button.resize(300, 60);// button.show();// QNetworkAccessManager* manager = new QNetworkAccessManager(&button);// QObject::connect(&button, &QPushButton::clicked, [&]() {// QUrl url("https://www.baidu.com");// QNetworkRequest request(url);// QNetworkReply* reply = manager->get(request);// QObject::connect(reply, &QNetworkReply::finished, [reply]() {// if (reply->error() == QNetworkReply::NoError) {// QByteArray data = reply->readAll();// QMessageBox::information(nullptr, "Response", QString::fromUtf8(data.left(200))); // 截取前200字符// std::cout << "Response Data: " << data.left(100000).toStdString() << "...\n";// } else {// QMessageBox::warning(nullptr, "Error", reply->errorString());// }// reply->deleteLater();// });// });// return app.exec();// SQLQApplication app(argc, argv);QPushButton button("Init QtSQL Database");button.resize(250, 60);button.show();QObject::connect(&button, &QPushButton::clicked, [&]() {if (initDatabase()) {QMessageBox::information(nullptr, "Success", "Database initialized and queried!");} else {QMessageBox::warning(nullptr, "Error", "Database operation failed!");}});return app.exec();
}
Qt6学习入门——环境搭建