cmake、QT 5、ubuntu、vscode、图传
vscode
项目结构

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #ifndef HELLO_H #define HELLO_H
#include <QWidget> #include <QPushButton>
class HelloWindow : public QWidget { Q_OBJECT
public : explicit HelloWindow(QWidget *parent = nullptr);
private slots: void toggleText();
private: QPushButton *button; bool isHello; };
#endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include "hello.h"
HelloWindow::HelloWindow(QWidget *parent) : QWidget(parent), isHello(true) { button = new QPushButton("Hello", this);
button->setGeometry(50, 50, 100, 50);
connect(button, &QPushButton::clicked, this, &HelloWindow::toggleText); }
void HelloWindow::toggleText() { if (isHello) { button->setText("Word"); } else { button->setText("Hello"); } isHello = !isHello; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <QApplication> #include "hello.h"
int main(int argc, char *argv[]) { QApplication app(argc, argv);
HelloWindow window; window.setWindowTitle("Hello Word App"); window.resize(200, 150); window.show();
return app.exec(); }
|
CMakeLists.txt
- 请参考
https://doc.qt.io/qt-5/cmake-get-started.html
- 注意生成可执行文件那里和普通项目的区别
- 一般项目中,头文件不直接参与编译(预处理阶段通过
#include 处理了头文件内容),最终编译的单元是源文件(.cpp 或 .c)。
- 在 Makefile 中,需要通过
-I 指定头文件路径,以便预处理器能够正确解析 #include 的路径。
- 在 CMake 中,通过
target_include_directories() 等命令管理头文件路径,这些路径最终会转化为类似 -I 的选项,添加到生成的构建文件中。
- 在 Qt 项目中,
Q_OBJECT 宏需要 MOC 工具解析头文件并生成元对象代码。MOC 是构建过程中的独立阶段,与预处理或编译不同,因此头文件路径必须显式指定(将头文件加入构建目标)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| cmake_minimum_required(VERSION 3.14) project(MyQtApp)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/qt5")
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON)
find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
file(GLOB SRC_FILES "${CMAKE_SOURCE_DIR}/src/*.cpp") file(GLOB HEADER_FILES "${CMAKE_SOURCE_DIR}/header/*.h")
add_executable(MyQtApp ${SRC_FILES} ${HEADER_FILES})
target_include_directories(MyQtApp PRIVATE "${CMAKE_SOURCE_DIR}/header")
target_link_libraries(MyQtApp Qt5::Widgets)
|


qtcreator+vscode
项目重构
- 下方是一个使用
qtcreator+qmake创建的qt项目,接下来用cmake改造
- 使用
qtcreator+cmake创建的项目或者cmake改造项目,都需要把ui放到cpp所在目录(子目录也不行),参与编译。
- 使用vscode方便重构(如果有需求,下图是重构结构后的结果【保留了.pro等文件,后续也可以改造回使用qmake】)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE
class MainWindow : public QMainWindow { Q_OBJECT
public: MainWindow(QWidget *parent = nullptr); ~MainWindow();
private slots: void on_pushButton_clicked();
private: Ui::MainWindow *ui; }; #endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include "mainwindow.h" #include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); }
MainWindow::~MainWindow() { delete ui; }
void MainWindow::on_pushButton_clicked() {
}
|
1 2 3 4 5 6 7 8 9 10 11
| #include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
|
就拖拽了个按键,也是最终的运行结果

CMakeLists.txt
多了ui参与编译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| cmake_minimum_required(VERSION 3.14) project(MyQtApp)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/qt5")
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON)
find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
file(GLOB SRC_FILES "${CMAKE_SOURCE_DIR}/src/*.cpp") file(GLOB HEADER_FILES "${CMAKE_SOURCE_DIR}/header/*.h") file(GLOB UI_FILES "${CMAKE_SOURCE_DIR}/src/*.ui")
add_executable(MyQtApp ${SRC_FILES} ${HEADER_FILES} ${UI_FILES})
target_include_directories(MyQtApp PRIVATE "${CMAKE_SOURCE_DIR}/header")
target_link_libraries(MyQtApp Qt5::Widgets)
|

我的方案
- 综合使用qtcreator+vscode+cmake
- 使用ui文件(xml语法),将界面和逻辑分离
- qtcraeter+cmake
- 可以使用vscode方便的连接修改、编译、运行、安装、打包,目录结构重构和重构后的测试。
- 开启图传后,ssh或vscode 终端中输入qtcreator即可在windows下使用qtcreator
更多
参考ubuntu配置QT环境和测试