RM的代码很多都是CMake构建,并且没有上位机。想要给CMake工程添加Qt的界面,写一个上位机,主要是为了方便地调试参数:能够对代码中摄像头曝光、分辨率等各个参数进行控制,同时,代码运行的结果也能在上位机上绘制曲线生成更好理解的图表结果。
上交的工程用CMake构建的。可以直接用qt打开CMakeLists.txt这个文件,把Qt当做一个普通的IDE来使用。
添加qt的界面有两种方法。一种是在CMakeLists.txt中添加Qt的模块,仍然使用CMake构建工程。另一种是生成.pro文件,改为使用qmake构建整个工程。
在CMakeLists.txt的同级目录中使用命令qmake -project
可以让qmake根据CMakeLists.txt生成.pro文件,但是不完全,会报错,需要debug。我暂时没有时间精力把咱们的工程再改成qmake的。大家有兴趣去鼓捣鼓捣吧。
今天只分享一下如何用CMake构建整个工程,同时能够使用Qt的各种库。通过已经写好的一个Demo来展示最少的步骤。
一 Demo文件树
二 CMakeLists.txt
三 main.cpp
四 Qt设计师界面类
五 提示
微信公众号
一 Demo文件树
│ CMakeLists.txt
│ main.cpp
│ mainwindow.cpp
│ mainwindow.h
│ mainwindow.ui
│ tree.txt
└─build
└─构建工程生成的各种临时文件
在windows生成好看的文件树命令:tree /f >tree.txt
把当前路径下的文件树保存在当前路径的tree.txt文件中,有需要的时候从txt文件中拷贝文件树。
二 CMakeLists.txt
在这个文件,需要加载Qt的各种库,以及Qt有别于标准C++的各种特性的翻译开关。
#设置CMake最小版本
cmake_minimum_required(VERSION 3.5)
#设置工程名
project (Qt_cmake)
#注意,在一个大工程里,这几个开关一定要尽量放在前面打开,否则有可能会报无法生成ui文件的错误
set(CMAKE_AUTOMOC ON)#自动翻译信号与槽
set(CMAKE_AUTORCC ON)#自动翻译资源文件为cpp文件
set(CMAKE_AUTOUIC ON)#自动翻译界面文件为cpp文件
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#注意,在一个大工程里,这几个开关一定要尽量放在前面打开,否则有可能会报无法生成ui文件的错误
set(CMAKE_PREFIX_PATH "~/Qt5.9.9/5.9.9/gcc_64/")#设置Qt库的路径,为了不在Qt creator这个软件中运行cmake,也能找到Qt的库。
find_package(Qt5 COMPONENTS Widgets Gui Core REQUIRED)
#将源代码生成可执行文件
add_executable(hello_cmake main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)
#将qt库和可执行文件链接起来
target_link_libraries(hello_cmake Qt5::Core Qt5::Widgets Qt5::Gui)
#在这里,为目标链接了/usr/lib/x86_64-linux-gnu/libpthread.so
#如果不链接就会报错,因为代码中使用了线程,这是系统里的库,直接链接就行。不过令人纳闷的是上交代码没链接pthread也可以运行线程
#如果是用的.pro文件,则在里面加上LIBS+=/usr/lib/x86_64-linux-gnu/libpthread.so
target_link_libraries(hello_cmake pthread)
注意事项:
1.AUTOUIC等的开启尽量放在最前面,不然会报无法生成和无法找到ui_mainwindow.h的错
2.在13行,set(CMAKE_PREFIX_PATH "~/Qt5.9.9/5.9.9/gcc_64/")
需要设置Qt库的路径,和安装的位置有关系, 我将Qt5.9.9装在了~/下,这里需要更换一下。如果只是单纯想要在Qt里运行这个CMake工程的话,那么这个路径错了也无所谓。可是如果想在命令行里运行cmake和make编译运行代码的话。这个路径需要正确,否则会找不到Qt5widgetconfig.cmake之类的库。到gcc_64下即可,这个文件夹下是bin、lib等文件夹。
- 想要使用Qt的各种功能,首先你需要在电脑中安装Qt库。一般就是去官网下载IDE的时候,把Qt库安装了。
三 main.cpp
#include
#include "mainwindow.h"
#include
#include
#include
#include
#include
int QtWindow(int argc, char *argv[]){
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
int main(int argc, char *argv[]){
QTime startTime = QTime::currentTime();
std::thread t(QtWindow, argc,argv);
while(1)
{
QTime stopTime = QTime::currentTime();
if(startTime.msecsTo(stopTime)>4000)//4s输出一次
{
qDebug()<<" 输出"<<endl;
startTime = stopTime;
}
}
std::cout <"Hello Qt-CMake!" <std::endl;
return 0;
}
我们之前所学的Qt代码。他的主事件循环是return a.exec()。这个东西阻塞了整个函数的运行。
但是呢,RM代码主函数里有一个while大循环,一直在执行图像处理的代码。所以显然我们不能让这个Qt窗口阻碍代码的运行,所以在这里开了一个线程,里面使用return a.exec(),窗口阻塞的只是线程,除非程序结束,窗口才会因为线程结束而结束,就实现了窗口和图像处理并行运行的效果。
while()循环里每隔5s在控制台输出一个字符串,同时可以对Qt窗口进行操作,验证二者是并行的。
四 Qt设计师界面类
有了CMakeLists.txt和main函数之后,先使用Qt打开CMakeLists.txt文件。
然后右击整个工程。点击file。新建qt,设计师界面类,然后建一个mainwindow。就会产生mainwindow.cpp,mainwindow.hmainwindow.ui三个文件,把这三个文件直接放在main.cpp的目录下即可。想要编辑界面的话,还是需要使用Qt这个软件的。
我在这里做的修改主要是打开一个窗口,在文本框输入内容,再点击一下按钮,标签上会显示输入的内容。
void MainWindow::on_pushButton_pressed()
{
ui->label_2->setText(ui->lineEdit->text());
}
五 提示
关于如何在Qt中利用CMake构建工程,qt的手册上写了很多。虽然是英文的,但是写得很详细,值得细心阅读。阅读方法:
使用在线文档,利用谷歌浏览器打开,使用谷歌翻译翻译全页。
https://doc.qt.io/qt-5/cmake-manual.html
在Qt Creator软件中搜索Cmake,会出现相同的英文文档。可以在电脑中安装有道翻译,进行取词,啃英文。
Tips
这是三丰陪英俊帅气的你成长的第16篇文章 关注学习更多图像处理知识