阅读本文,默认安装好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一样进行编辑了。