Qt入门学习记录
初次使用qt,目前熟悉了一些基础的控件
代码记录
test.h
//
// Created by echo on 2025/9/22.
//#ifndef MY_APP_TEST_H
#define MY_APP_TEST_H#include <QWidget>
#include <QDebug>
#include <QPushButton>
#include <QString>
#include <QDebug>
QT_BEGIN_NAMESPACEnamespace Ui {class Test;
}QT_END_NAMESPACEclass Test : public QWidget {Q_OBJECTpublic:explicit Test(QWidget *parent = nullptr);QPushButton *ball;~Test() override;private:Ui::Test *ui;
};#endif //MY_APP_TEST_H
test.cpp
// Created by echo on 2025/9/22.// 包含 Test 类的头文件
#include "test.h"
// 包含由 Qt uic 工具自动生成的 UI 头文件
#include "ui_Test.h"// Test 类的构造函数
Test::Test(QWidget *parent): QWidget(parent), // 初始化父类 QWidgetui(new Ui::Test) // 创建 UI 对象
{// 设置 UI,初始化界面控件ui->setupUi(this);// 修改界面// ui->button1->move(100,100);// ui->button1->resize(300, 300);//ball - new QPushButton(this);ball = new QPushButton(ui->frame); // 默认是父级的零点位置ball ->move(300,300);ball ->resize(40,40);//按钮圆角为20px,就变成圆了 线宽为3px的黑线ball ->setStyleSheet( "background-color:rgb(212,33,66);""border-radius:20px;""border:3px solid black;");// 测试qDebug,会在控制台输出信息qDebug() << "x:" << ball -> x();qDebug() << "y:" << ball -> y();qDebug() << ball->styleSheet();ui->label1->setText("谁是大帅比?");connect(ui->exit,SIGNAL(clicked()),this,SLOT(close())); // 老式//disconnect(ui->exit,SIGNAL(clicked()),this,SLOT(close()));// 连接 button1 的点击信号到一个 lambda 表达式+// 当 button1 被点击时,label1 显示 "Button clicked"// 新式connect(ui->button1, &QPushButton::clicked, this, [=]() {ui->label1->setText("柯思源大帅比");ui->img4->setStyleSheet("border-image: url(:/img/smile.jpg);");});connect(ui->button2, &QPushButton::clicked, this, [=]() {ui->label1->setText("柯思源小帅比");ui->img3->setStyleSheet("border-image: url(:/img/goblin.jpg);");});// 上下左右移动----pushbutton控制逻辑connect(ui->up, &QPushButton::clicked, this, [=]() {if (ball->y() >50) {ball->move(ball->x(),ball->y()-50);}ui->ball_x->setText(QString::number(ball->x()));ui->ball_y->setText(QString::number(ball->y()));});connect(ui->down, &QPushButton::clicked, this, [=]() {if (ball->y() <550) {ball->move(ball->x(),ball->y()+50);}ui->ball_x->setText(QString::number(ball->x()));ui->ball_y->setText(QString::number(ball->y()));});connect(ui->left, &QPushButton::clicked, this, [=]() {if (ball->x() > 50) {ball->move(ball->x() - 50,ball->y());}ui->ball_x->setText(QString::number(ball->x()));ui->ball_y->setText(QString::number(ball->y()));});connect(ui->right, &QPushButton::clicked, this, [=]() {if (ball->x() < 550) {ball->move(ball->x() + 50,ball->y());}ui->ball_x->setText(QString::number(ball->x()));ui->ball_y->setText(QString::number(ball->y()));});// comboBox使用示范ui->comboBox->addItem(("大帅比"));//ui->comboBox->clear(); // 清空所有选项ui->comboBox->setCurrentIndex(2); // 默认显示第几个qDebug() << ui->comboBox->currentIndex();qDebug() << ui->comboBox->currentText();
//------------------------------------------------------ QLineEdit输入框的实现逻辑----------------------------------------------------------------//// 当在 lineEdit_2 中按下回车键时,使其失去焦点,光标随之消失connect(ui->lineEdit_2, &QLineEdit::returnPressed, this, [=]() {ui->lineEdit_2->clearFocus();// QString _string = ui->lineEdit_2->text();// int _num = _string.toInt();int _num = ui->lineEdit_2->text().toInt(); // 省个变量if (ui->comboBox->currentIndex() == 0) {ball->move(_num ,ball->y());ui->ball_x->setText(QString::number(ball->x()));ui->ball_y->setText(QString::number(ball->y()));} else if (ui->comboBox->currentIndex() == 1) {ball->move(ball->x() ,_num);ui->ball_x->setText(QString::number(ball->x()));ui->ball_y->setText(QString::number(ball->y()));}else {ui->ball_x->setText("ksy");ui->ball_y->setText("大帅比");}});}// Test 类的析构函数
Test::~Test() {// 释放 UI 资源,防止内存泄漏delete ui;
}
main.cpp
// 包含 Qt 应用程序类头文件
#include <QApplication>
// 包含 Qt 按钮控件头文件
#include <QPushButton>#include "widget/ui_Test.h"
#include "widget/test.h"// main 函数,程序入口
int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建 QApplication 对象,管理应用程序的控制流和主要设置Test T;T.show();return QApplication::exec();
}
res.qrc
<RCC><qresource prefix="/"><!-- 例如:<file>icons/app.png</file> --><file>img/smile.jpg</file><file>img/goblin.jpg</file></qresource>
</RCC>
CmakeList.txt
cmake_minimum_required(VERSION 4.0)# -------------------------------- 基础配置 --------------------------------
# 设置应用程序名称,后续所有目标、安装等都用这个变量,方便统一修改
set(APP_NAME My_App)
# 动态获取项目名称(使用源码目录名)
get_filename_component(PROJECT_NAME ${CMAKE_SOURCE_DIR} NAME)
string(TOUPPER ${APP_NAME} PROJECT_NAME_CAPITALIZED) # 转换为大写(可选)# -------------------------------- 版本管理 --------------------------------
# 使用 project() 内置版本管理(主版本将被缓存)
project(${APP_NAME}VERSION 1.0.0 # 默认版本号LANGUAGES CXX # 指定语言
)# 允许通过命令行覆盖版本参数
set(PROJECT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} CACHE STRING "主版本号")
set(PROJECT_VERSION_MINOR ${PROJECT_VERSION_MINOR} CACHE STRING "次版本号")
set(PROJECT_VERSION_PATCH ${PROJECT_VERSION_PATCH} CACHE STRING "补丁版本号")
set(VERSION_SUFFIX "" CACHE STRING "版本后缀 (如: beta, rc1)")# 组合完整版本号
if (VERSION_SUFFIX)set(PROJECT_FULL_VERSION "${PROJECT_VERSION}-${VERSION_SUFFIX}")
else ()set(PROJECT_FULL_VERSION "${PROJECT_VERSION}")
endif ()# -------------------------------- 构建信息 --------------------------------
# 配置构建信息输出级别
set(CMAKE_MESSAGE_LOG_LEVEL NOTICE) # 抑制冗余信息
set(CMAKE_SUPPRESS_REGENERATION ON) # 禁止自动重新生成
set(CMAKE_VERBOSE_MAKEFILE OFF) # 关闭详细构建日志# -------------------------------- Git 信息 --------------------------------
find_package(Git QUIET)
set(GIT_HASH "unknown")
set(GIT_BRANCH "unknown")if (GIT_FOUND)# 获取 Git 短哈希execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEADWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}OUTPUT_VARIABLE GIT_HASH_TMPOUTPUT_STRIP_TRAILING_WHITESPACERESULT_VARIABLE GIT_RESULT)# 获取 Git 分支名execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEADWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}OUTPUT_VARIABLE GIT_BRANCH_TMPOUTPUT_STRIP_TRAILING_WHITESPACERESULT_VARIABLE GIT_RESULT)# 处理执行结果if (GIT_RESULT EQUAL 0)set(GIT_HASH ${GIT_HASH_TMP})set(GIT_BRANCH ${GIT_BRANCH_TMP})endif ()
endif ()# 获取构建时间戳
string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%d %H:%M:%S")# -------------------------------- Qt 配置 --------------------------------
# 启用自动处理 Qt 资源
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)# 查找必需 Qt 组件
find_package(Qt6 REQUIRED COMPONENTSCore # 必须显式包含Gui # 必须显式包含WidgetsSql
)# -------------------------------- 编译选项 --------------------------------
# C++ 标准配置
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)# 目标专属编译选项
add_library(project_warnings INTERFACEsrc/widget/test.cppsrc/widget/test.hsrc/widget/test.ui)
target_compile_options(project_warnings INTERFACE# MSVC 选项$<$<CXX_COMPILER_ID:MSVC>:/W4 # 警告等级4/WX # 视警告为错误/permissive- # 标准一致性模式># GCC/Clang 选项$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wall-Wextra-Wpedantic>
)# -------------------------------- 源文件收集 --------------------------------
set(PROJECT_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})# 使用 CONFIGURE_DEPENDS 自动跟踪新文件
file(GLOB_RECURSE SRC_FILES CONFIGURE_DEPENDS"${PROJECT_ROOT_DIR}/src/*.cpp""${PROJECT_ROOT_DIR}/src/*.h""${PROJECT_ROOT_DIR}/src/*.ui""${PROJECT_ROOT_DIR}/src/*.qrc" # 建议 qrc 文件放在 src 目录
)# 在 IDE 中按目录结构组织文件
source_group(TREE ${PROJECT_ROOT_DIR} FILES ${SRC_FILES})# -------------------------------- 可执行目标 --------------------------------
# 生成可执行文件,所有源文件都打包进 ${APP_NAME}
add_executable(${APP_NAME} ${SRC_FILES}src/widget/test.cppsrc/widget/test.hsrc/widget/test.ui)# 链接库和编译器选项
# PRIVATE 表示只对本目标生效
# 必须链接 Qt5::Core/Gui/Widgets/Sql,否则无法编译 Qt 程序
# project_warnings 是自定义的警告设置
# 这里用变量,方便后续统一修改
# 例如:target_link_libraries(${APP_NAME} PRIVATE Qt5::Core ...)
target_link_libraries(${APP_NAME} PRIVATEQt6::CoreQt6::GuiQt6::WidgetsQt6::Sqlproject_warnings
)# 包含目录配置
target_include_directories(${APP_NAME} PRIVATE${CMAKE_CURRENT_SOURCE_DIR}/src${CMAKE_CURRENT_BINARY_DIR} # 自动生成的 moc 文件
)# -------------------------------- 平台特定配置 --------------------------------
if (WIN32)# 定义 Windows 下的宏,减少头文件体积,指定 Windows 10 APItarget_compile_definitions(${APP_NAME} PRIVATEWIN32_LEAN_AND_MEAN_WIN32_WINNT=0x0A00 # Windows 10)# Release 模式下为 GUI 程序(无命令行窗口),Debug 下为控制台程序(方便调试)set_target_properties(${APP_NAME} PROPERTIESWIN32_EXECUTABLE $<CONFIG:Release># 设置可执行文件输出目录为工程根目录下 bin 文件夹,Linux/Windows 都适用RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")elseif (APPLE)target_compile_definitions(${APP_NAME} PRIVATE MACOS)set_target_properties(${APP_NAME} PROPERTIESMACOSX_BUNDLE TRUEMACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_FULL_VERSION}MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION})set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13")else ()target_compile_definitions(${APP_NAME} PRIVATE LINUX)
endif ()# -------------------------------- 构建信息注入 --------------------------------
target_compile_definitions(${APP_NAME} PRIVATEBUILD_GIT_HASH="${GIT_HASH}"BUILD_GIT_BRANCH="${GIT_BRANCH}"BUILD_TIMESTAMP="${BUILD_TIMESTAMP}"PROJECT_FULL_VERSION="${PROJECT_FULL_VERSION}"
)# -------------------------------- 安装规则 --------------------------------
include(GNUInstallDirs)install(TARGETS ${APP_NAME}BUNDLE DESTINATION . # macOS .appRUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # Windows/Linux 可执行文件LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # 共享库
)# 安装附加资源(假设存在 assets 目录)
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/assets")install(DIRECTORY assets/DESTINATION ${CMAKE_INSTALL_DATADIR}/${APP_NAME})
endif ()# macOS 专用 Bundle 修复
if (APPLE)install(CODE "include(BundleUtilities)")install(CODE "fixup_bundle(\${CMAKE_INSTALL_PREFIX}/${APP_NAME}.app \"\" \"\")")
endif ()# -------------------------------- 自动创建项目目录结构 --------------------------------
# 定义目录结构
set(SRC_DIR "${CMAKE_SOURCE_DIR}/src")
set(SUBDIRS"${SRC_DIR}/resource""${SRC_DIR}/utils""${SRC_DIR}/widget"
)# 创建目录
foreach (dir ${SUBDIRS})if (NOT EXISTS ${dir})file(MAKE_DIRECTORY ${dir})endif ()
endforeach ()
qt界面
实际效果
各种其他控件
QTimer定时器
//------------------------------------------------显示当前时间(使用QTimer定时器)--------------------------------------------------------------//// 创建一个 QTimer 对象,父对象为 thisQTimer *timer = new QTimer(this);ui->CurrentTime->setReadOnly(true); // 设置 CurrentTime 输入框为只读,防止用户修改// 连接 QTimer 的 timeout() 信号到一个 lambda 表达式// 每当定时器超时,lambda 表达式中的代码就会被执行connect(timer, &QTimer::timeout, this, [=]() {// 在控制台输出调试信息//qDebug() << "1s说一次:ksy大帅比!";QDateTime current_time = QDateTime::currentDateTime(); // 每一秒获取一次当前时间ui->CurrentTime->setText(current_time.toString("yyyy.MM.dd hh:mm:ss dddd")); // 设置时间显示格式并显示在 CurrentTime 输入框中});// 启动定时器,设置间隔为 1000 ms(1秒)timer->start(1000);
参考:Clion联合Qt开发