cmake和qt学习笔记

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


家人,有很多不足,希望指正 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值