vs通过插件方式指定qt的sdk,linux中通过qt creator来指定sdk,cmake怎么指定qt的sdk库,在代码中怎么去加载和不耦合,项目中怎么设定qt库的位置,和qt头文件的位置
CMakeLists.txt是cmake的配置项-----项目文件
main.cpp
#include <iostream>
using namespace std;
int main()
{
cout<<"test cmake qt"<<endl;
return 0;
}
CMakeLists.txt
#cmake提供的最低的版本
cmake_minimum_required(VERSION 3.10)
#声明工程的名字(TARGET,可执行程序)
project(qt_cmake)
#声明生成目标文件和目标文件所依赖的代码文件
add_executable($(PROJECT_NAME) main.cpp factorial.cpp printfhello.cpp)
进入控制台,cmake -S. -B build(解释:-S.表示我们的CMakeLists.txt在哪个目录,-B表示生成项的文件在哪)---生产项目文件
生产配置项在build里面可以看到生成的文件
cmake --build build(第二个Build是上面的build目录)----编译项目
执行生成的目标文件:test cmake qt
执行--------qt_cmake.exe----在build/Debug/
cmd的一些命令:dir跟ls很像,cls清除
加QT的内容
不加界面,先直接加库
在main.cpp里面修改
#include <iostream>
#include <QtWidgets/QApplication>
using namespace std;
int main(int argc,char *argv)
{
cout<<"test cmake qt"<<endl;
QApplication a(argc,argv);
return a.exec();
}
这个时候编译不过,因为没有相应的库需要在CMakeLists.txt里面加QT的库
#cmake提供的最低的版本
cmake_minimum_required(VERSION 3.10)
#声明工程的名字(TARGET,可执行程序)
project(qt_cmake)
#编译执行程序
#声明生成目标文件和目标文件所依赖的代码文件
add_executable($(PROJECT_NAME) main.cpp factorial.cpp printfhello.cpp)
#导入QT的库,指定QT的库,怎么查找之类的
#QT6是在6里面查找相应的库,COMPONENTS主线只用widgets,require如果找不到整个编译就失败
find_package(QT6 COMPONENTS Widgets REQUIRED)
#找到之后,对目标链接一个库,指定QT依赖库和头文件路径
target_link_libraries($(PROJECT_NAME)
#需要的库一次加在QT6后面就行
QT6::Widgets pthread
)
#windeployqt的路径放着,依赖的库
#自动复制依赖的动态库windeployqt.exe
然后再重新生成
clear/cls
cmake -S. -B build
如果报错可能需要看一下QT路径下是否需要指定cmake-config
我跟着学习的教程是QT5的,但是我是QT6就不需要这几步,我截个图放着
希望大神指点
加界面
UI生成我们的cmake代码----修改CMakeLists.txt
#cmake提供的最低的版本
cmake_minimum_required(VERSION 3.10)
#声明工程的名字(TARGET,可执行程序)
project(qt_cmake)
#变量,自动UI转换为C++代码
#把uic qtcmake.ui转成ui_qtcmake.h的文件
set(CMAKE_AUTOUIC ON)
#编译执行程序
#声明生成目标文件和目标文件所依赖的代码文件
add_executable($(PROJECT_NAME)
main.cpp
qtcmake.ui
)
#导入QT的库,指定QT的库,怎么查找之类的
#QT6是在6里面查找相应的库,COMPONENTS主线只用widgets,require如果找不到整个编译就失败
find_package(QT6 COMPONENTS Widgets REQUIRED)
#找到之后,对目标链接一个库,指定QT依赖库和头文件路径
target_link_libraries($(PROJECT_NAME)
#需要的库一次加在QT6后面就行
QT6::Widgets pthread
)
#windeployqt的路径放着,依赖的库
#自动复制依赖的动态库windeployqt.exe
这样写好之后会自动将UI代码转换成cmake能识别的代码
之后需要将build全部清除掉再编译------rd /S/Q build
cmake -S. -B build +qt库路径
cmake --build build
在main.cpp中加入ui_qtcmake.h头文件
#include <iostream>
#include <QtWidgets/QApplication>
#include "ui_qtcmake.h"
using namespace std;
int main(int argc,char *argv)
{
cout<<"test cmake qt"<<endl;
QApplication a(argc,argv);
return a.exec();
}
显示界面,写一个qtcmake.cpp和qtcmake.h:
qtcmake.h
//qtcmake.h,防止在一个cpp中多次引用
#ifndef QTCMAKE_H
#define QTCMAKE_H
#include <QtWidgets/QWidget>
#include "ui_qtcmake.h"
class QtCmake:public QWidget
{
Q_OBJECT//后面信号槽生成
public:
QtCmake(QWidget *p=nullptr);
private:
Ui:Form ui_;
};
#endif
这个时候就可以把main.cpp里面的ui_qtcmake.h的头文件删除
qtcmake.cpp
/qtcmake.cpp
#include "qtcmake.h"
QtCmake::QtCmake(QWidget *p):QWidget(p)
{
ui_.setupUi(this);
}
main.cpp修改
#include <iostream>
#include <QtWidgets/QApplication>
//#include "ui_qtcmake.h"
#include "qtcmake.h"
using namespace std;
int main(int argc,char *argv)
{
cout<<"test cmake qt"<<endl;
QApplication a(argc,argv);
QtCmake qc;
qc.show();
return a.exec();
}
CMakeLists.txt
#cmake提供的最低的版本
cmake_minimum_required(VERSION 3.10)
#声明工程的名字(TARGET,可执行程序)
project(qt_cmake)
#变量,自动UI转换为C++代码
#把uic qtcmake.ui转成ui_qtcmake.h的文件
set(CMAKE_AUTOUIC ON)
#自动生成资源文件代码RCC转成.h
set (CMAKE_AUTORCC ON)
#自动生成信号槽代码--QTCMAKE.H加了Q_OBJECT就需要
set (CMAKE_AUTOMOC ON)
#编译执行程序
#声明生成目标文件和目标文件所依赖的代码文件
add_executable($(PROJECT_NAME)
main.cpp
qtcmake.ui
qtcmake.cpp
qtcmake.h
)
#导入QT的库,指定QT的库,怎么查找之类的
#QT6是在6里面查找相应的库,COMPONENTS主线只用widgets,require如果找不到整个编译就失败
find_package(QT6 COMPONENTS Widgets REQUIRED)
#找到之后,对目标链接一个库,指定QT依赖库和头文件路径
target_link_libraries($(PROJECT_NAME)
#需要的库一次加在QT6后面就行
QT6::Widgets pthread
)
#windeployqt的路径放着,依赖的库
#自动复制依赖的动态库windeployqt.exe
添加信号槽和资源
qcmake.h
//qtcmake.h,防止在一个cpp中多次引用
#ifndef QTCMAKE_H
#define QTCMAKE_H
#include <QtWidgets/QWidget>
#include "ui_qtcmake.h"
class QtCmake:public QWidget
{
Q_OBJECT//后面信号槽生成
public:
QtCmake(QWidget *p=nullptr);
public slots:
void TestCMake();
private:
Ui:Form ui_;
};
#endif
qcmake.cpp
/qtcmake.cpp
#include "qtcmake.h"
#include <QMessageBox>
QtCmake::QtCmake(QWidget *p):QWidget(p)
{
ui_.setupUi(this);
}
void QtCmake::TestCMake()
{
QMessageBox::information(0,"","Test Cmake QT");
}
在CMakeLists.txt中加qrc
#cmake提供的最低的版本
cmake_minimum_required(VERSION 3.10)
#声明工程的名字(TARGET,可执行程序)
project(qt_cmake)
#变量,自动UI转换为C++代码
#把uic qtcmake.ui转成ui_qtcmake.h的文件
set(CMAKE_AUTOUIC ON)
#自动生成资源文件代码RCC转成.h
set (CMAKE_AUTORCC ON)
#自动生成信号槽代码--QTCMAKE.H加了Q_OBJECT就需要
set (CMAKE_AUTOMOC ON)
#编译执行程序
#声明生成目标文件和目标文件所依赖的代码文件
add_executable($(PROJECT_NAME)
main.cpp
qtcmake.ui
qtcmake.cpp
qtcmake.h
qtcmake.qrc
)
#导入QT的库,指定QT的库,怎么查找之类的
#QT6是在6里面查找相应的库,COMPONENTS主线只用widgets,require如果找不到整个编译就失败
find_package(QT6 COMPONENTS Widgets REQUIRED)
#找到之后,对目标链接一个库,指定QT依赖库和头文件路径
target_link_libraries($(PROJECT_NAME)
#需要的库一次加在QT6后面就行
QT6::Widgets pthread
)
#windeployqt的路径放着,依赖的库
#自动复制依赖的动态库windeployqt.exe
家人,有很多不足,希望指正