Qt6学习入门——环境搭建
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();
// SQL
QApplication 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学习入门——环境搭建
浙公网安备 33010602011771号