关于visual studio2022通过cmake详细一步到位手动构建qt6项目 以及一些调试上可能出现的问题(2024/7/12)

阅读本文,默认安装好visual的qt相关插件

部分参考资料和相关代码

CMake+Visual Studio构建Qt程序 - 车臣 - 博客园 (cnblogs.com)

如果只是调试debug运行不了的问题请跳转最下方小细节

首先创建一个cmake项目

直接先放上去能够运行的代码\

CMakeLists.txt

cmake_minimum_required(VERSION 3.12.0)

project(CMAKE_QT6_font)

#将cpp版本限制为c++17这个很关键
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(VERSION_MAJOR 0)
set(VERSION_MINOR 0)
set(VERSION_PATCH 1)

set(CMAKE_PREFIX_PATH H:/qt6.2/6.2.4/msvc2019_64) #改成你qt文件夹中vs编译器的位置

#内别路径自动添加
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#进行QT内部ui,obj原对象等自动转换

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt6 REQUIRED COMPONENTS Core Widgets Gui) #使用Qt6中自带的查找方式

set(project_headers CMAKE_QT6_font.h) #改成你需要构建的头文件
set(project_sources main.cpp CMAKE_QT6_font.cpp) #改成你需要构建的cpp文件{.h和.cpp都加进去其实没影响}

add_executable(${PROJECT_NAME} WIN32 ${project_headers} ${project_ui} ${project_sources})

target_link_libraries(${PROJECT_NAME}
    PUBLIC
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets)

比起原先的内容这里将QT5模块修改为QT6即可,这里修改cmakelist要修改子项目中的

main.cpp【手动在项目中新建一个cpp文件,用来运行代码窗口】

#include <QApplication>
#include "CMAKE_QT6_font.h"//根据你的默认文件来命名


int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();
    return app.exec();
}

 CMAKE_QT6_font.cpp【如果加入ui文件这里可以把关系改成ui继承】

#include "CMAKE_QT6_font.h"
MainWindow::MainWindow(QWidget* parent)
    :QMainWindow(parent)
{
    resize(800, 600);
}

MainWindow::~MainWindow()
{

}

 CMAKE_QT6_font.h

#ifndef _MAINWINDOW_H
#define _MAINWINDOW_H

#include <QMainWindow>
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget* parent = nullptr);
    ~MainWindow();

private:

};

#endif // _MAINWINDOW_H

注意比起链接里面原来用qt5构建的文章,我们在使用qt6进行构建的时候需要加入下面一段代码

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

qt6要求的c++版本为c++17,如果不加上这行代码可能出现下面的问题

debug运行不出来的相关问题,

注意运行代码的时候使用qt中的编译器去运行,Qt-debug或者而不是去使用他原来带有的64-debug编译。(很多网上教程没有说完全导致这里可能成为一个坑)

修改之后就可义正常运行了

上面就已经可以使用qt程序了,如果我们想加入ui文件那么还要执行下面的步骤

创建一个你需要的默认ui文件我这里用的是Qwidget

方便打开ui文件我们需要在打开方式中添加qtcreate.exe的运行方式,或者designer的运行路径

补充一下关于ui文件的生成和使用:

默认情况下设置过qt uic到环境变量后直接输入在cmd(命令行)输入下段命令就可以生成qt中ui的cpp和.h,如果没有可以考虑将

[注意要cmd要进入目标目录才行否则需要使用绝对路径的形式]

#相对路径形式
uic xxx.ui -o xxx.cpp #生成文件名字可以随便取名
uic xxx.ui -o xxx.h
#绝对路径形式

uic H:\font_Ai\CMAKE_QT6_font\xx.ui :\font_Ai\CMAKE_QT6_font\xx.cpp
uic H:\font_Ai\CMAKE_QT6_font\xx.ui :\font_Ai\CMAKE_QT6_font\xx.h

qt中msvc编译目录下bin目录中的uic.exe添加到环境变量中如下图

H:\qt6.2\6.2.4\msvc2019_64\bin #环境变量路径

目录下就可以出现想要的文件了

由于我使用了子目录下面是我重新经过cmake进行构建的代码如下,加上生成的ui文件的声明是默认值,我们还需要进行一些修改

CmakeList.txt

cmake_minimum_required(VERSION 3.12.0)

project(CMAKE_QT6_font)

#将cpp版本限制为c++17这个很关键
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#set(VERSION_MAJOR 0)
#set(VERSION_MINOR 0)
#set(VERSION_PATCH 1)

set(CMAKE_PREFIX_PATH H:/qt6.2/6.2.4/msvc2019_64)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt6 REQUIRED COMPONENTS Core Widgets Gui)


include_directories("${PROJECT_SOURCE_DIR}"/UI)

set(project_headers CMAKE_QT6_font.h UI/ui_MainWindow.h ) #改成你需要构建的头文件
set(project_sources main.cpp CMAKE_QT6_font.cpp UI/ui_MainWindow.cpp) #改成你需要构建的cpp文件{.h和.cpp都加进去其实没影响}
set(project_ui UI/MainWindow.ui)



add_executable(${PROJECT_NAME} WIN32 ${project_headers} ${project_ui} ${project_sources})

target_link_libraries(${PROJECT_NAME}
    PUBLIC
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets)

 ui_MainWindow.cpp

把原来继承的Form 修改成自己取的类名,我这里是MainWindow

/********************************************************************************
** MainWindow generated from reading UI file 'MainWindow.ui'
**
** Created by: Qt User Interface Compiler version 6.2.4
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QPushButton *pushButton;

    void setupUi(QWidget *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(400, 300);
        pushButton = new QPushButton(MainWindow);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        pushButton->setGeometry(QRect(160, 120, 80, 24));

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QWidget *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
        pushButton->setText(QCoreApplication::translate("MainWindow", "test", nullptr));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // MAINWINDOW_H

 ui_MainWindow.h

/********************************************************************************
** MainWindow generated from reading UI file 'MainWindow.ui'
**
** Created by: Qt User Interface Compiler version 6.2.4
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QPushButton *pushButton;

    void setupUi(QWidget *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(400, 300);
        pushButton = new QPushButton(MainWindow);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        pushButton->setGeometry(QRect(160, 120, 80, 24));

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QWidget *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
        pushButton->setText(QCoreApplication::translate("MainWindow", "test", nullptr));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // MAINWINDOW_H

 CMAKE_QT6_font.cpp

#include "CMAKE_QT6_font.h"
#include "UI/ui_MainWindow.h"

MainWindow::MainWindow(QWidget* parent)
    :QWidget(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    resize(800, 600);
}

MainWindow::~MainWindow()
{
    delete ui;

}

 CMAKE_QT6_font.h

#ifndef _MAINWINDOW_H
#define _MAINWINDOW_H

#include <QWidget>
namespace Ui
{
    class MainWindow;
}
class MainWindow : public QWidget
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget* parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow* ui;
};

#endif // _MAINWINDOW_H

好了大功告成:

运行如下:接下来就可以在vs里面像qt一样进行编辑了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值