RoboMaster視覺筆記Qt(三)CMake工程添加Qt界面
本文工程下載界面:https://download.csdn.net/download/weixin_42089190/12473378
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
│ 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 <iostream>
#include "mainwindow.h"
#include <QApplication>
#include <QWidget>
#include <QDebug>
#include <thread>
#include <QTime>
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,設計師界面類,然後建一個買window。就會產生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,會出現相同的英文文檔。可以在電腦中安裝有道翻譯,進行取詞,啃英文。
整個可運行的工程大家可以關注微信公衆號,回覆 Qt-cmake 獲取,注意大小寫。或者可以在CSDN上下載。
歡迎通過微信與我交流。
微信公衆號
歡迎大家關注我的個人公衆號,現階段主要總結Robomaster相關的計算機視覺知識:Qt,C++,CMake,OpenCV等等
公衆號名稱:三豐雜貨鋪