QT概述
1.1什么是QT
Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形用户界面所需的所有功能。
Qt是诺基亚公司的一个产品。1996年,Qt进入商业领域,已成为全世界范围内数千种成功的应用程序的基础。它也是目前流行的Linux桌面环境KDE 的基础,KDE是Linux发行版的主要一个标准组件。
Qt 支持的平台有:
MS/Windows—95、98、NT 4.0、ME、2000、XP和Vista;
UNIX/X11—Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、
SGI IRIX和其他很多X11平台;
Macintosh—Mac OS X;
Embedded—有帧缓冲(framebuffer)支持的Linux平台、Windows CE;
Symbian/S60—目前已经可以提供技术预览版本。
1.2QT的安装
您可以到QT官网https://www.qt.io/选择对应的安装包之后进行下载安装
当然,现阶段QT不再支持某些版本的在线安装,您可以到https://download.qt.io/下载镜像的在线安装
等待安装完成之后即可
1.3第一个QT Demo
首先,恭喜你安装成功了你的QT,接下来我们进行第一个demo的开发,实现一个输入半径求面积的程序。
我这里使用CMake作为项目管理工具。CMakeList文件如下,你可以先不用关注CMakeList文件的编写,按照我的文件即可使用(在这之前你需要将你的QT bin目录配置到环境变量中)
1.3.1CMakeList.txt
cmake_minimum_required(VERSION 3.19) project(Test VERSION 1.0.1) #指定输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/output) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/output) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/output) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/output) #指定C++标准 set(CMAKE_CXX_STANDARD 17) #自动编译QT文件 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) #开启包含当前编译目录 set(CMAKE_INCLUDE_CURRENT_DIR ON) #指定QT版本和对应的库 set(QT_VERSION 5) set(REQUIRED_LIBS Core Gui Widgets) set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets) #寻找QT库 find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED) #自动查找头文件路径函数 macro(FIND_INCLUDE_DIR result curdir) #定义函数,2个参数:存放结果result;指定路径curdir; file(GLOB_RECURSE children "${curdir}/*.hpp" "${curdir}/*.h" ) #遍历获取{curdir}中*.hpp和*.h文件列表 file(GLOB SOURCE_INCLUDE ${children} ) #将文件放入 SOURCE_INCLUDE 中 set(dirlist "") #定义dirlist中间变量,并初始化 foreach(child ${children}) #for循环 string(REGEX REPLACE "(.*)/.*" "\\1" LIB_NAME ${child}) #字符串替换,用/前的字符替换/*h if(IS_DIRECTORY ${LIB_NAME}) #判断是否为路径 list (FIND dirlist ${LIB_NAME} list_index) #判断dirlist是否含有${LIB_NAME} if(${list_index} LESS 0) LIST(APPEND dirlist ${LIB_NAME}) #将合法的路径加入dirlist变量中 else() endif() #结束判断 endif() endforeach() #结束for循环 set(${result} ${dirlist}) #dirlist结果放入result变量中 endmacro() #自动查找源文件路径函数 macro(FIND_SRC_DIR result curdir) file(GLOB_RECURSE children "${curdir}/*.cpp" "${curdir}/*.cc") file(GLOB SOURCE_SRC ${children} ) set(dirlist "") foreach(child ${children}) string(REGEX REPLACE "(.*)/.*" "\\1" LIB_NAME ${child}) if(IS_DIRECTORY ${LIB_NAME}) list (FIND dirlist ${LIB_NAME} list_index) if(${list_index} LESS 0) LIST(APPEND dirlist ${LIB_NAME}) else() endif() endif() endforeach() set(${result} ${dirlist}) endmacro() #调用函数,指定参数 FIND_SRC_DIR(SRC_DIR_LIST ${PROJECT_SOURCE_DIR}/src) FIND_INCLUDE_DIR(INCLUDE_DIR_LIST ${PROJECT_SOURCE_DIR}/src) #将INCLUDE_DIR_LIST中路径列表加入工程,包括第三方库的头文件路径 include_directories( ${INCLUDE_DIR_LIST} #INCLUDE_DIR_LIST路径列表加入工程 ) #增减windows库文件 if(WIN32) set(PLAT_FROM_DEP ws2_32.lib ) endif() # 指定格式为utf-8 add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>") add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>") #使用指定的源文件来生成目标可执行文件 add_executable(${PROJECT_NAME} WIN32 main.cpp ${SOURCE_INCLUDE} ${SOURCE_SRC} ${UI_INCLUDE}) #set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") set_target_properties(${PROJECT_NAME} PROPERTIES CMAKE_MSVC_RUNTIME_LIBRARY_RELEASE "MultiThreaded$<$<CONFIG:Release>:Release>") #链接对应的库文件 target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED}) if(WIN32) target_link_libraries(${PROJECT_NAME} ${PLAT_FROM_DEP}) endif()
1.3.2你的项目目录需要像我一样配置
1.3.2你的项目目录需要像我一样配置
main.cpp
#include <QApplication> #include "circle.h" int main(int argc,char *argv[]) { QApplication app(argc, argv); Circle c; c.show(); return app.exec(); }
circle.cpp
#include "circle.h" #include <QPushButton> Circle::Circle(QWidget *parent) : QWidget(parent) { QGridLayout *layout1 = new QGridLayout(this); edit_ = new QLineEdit(this); edit_label_ = new QLabel("半径:",this); result_ = new QLineEdit(this); result_->setReadOnly(true); result_label_ = new QLabel("结果:",this); QPushButton *button = new QPushButton("计算",this); connect(button,&QPushButton::clicked,this,&Circle::btnClicked); layout1->addWidget(edit_label_,0,0); layout1->addWidget(edit_,0,1); layout1->addWidget(result_label_,0,2); layout1->addWidget(result_,0,3); layout1->addWidget(button,1,3); setLayout(layout1); } Circle::~Circle() { } void Circle::btnClicked() { double r = edit_->text().toDouble(); double area = r*r*3.14; result_->setText(QString::number(area)); }
circle.h
#ifndef TEST_CIRCLE_H #define TEST_CIRCLE_H #include <QWidget> #include <QGridLayout> #include <QLabel> #include <QLineEdit> class Circle : public QWidget { Q_OBJECT public: explicit Circle(QWidget *parent = nullptr); ~Circle() override; protected slots: void btnClicked(); private: QLineEdit *edit_; QLabel *edit_label_; QLineEdit *result_; QLabel *result_label_; }; #endif //TEST_CIRCLE_H