iMX287A嵌入式Qt環境搭建

@

1.嵌入式Qt簡介

Qt 是一個跨平台的應用程式開發框架。使用Qt開發的應用程式,只需要編寫一套程式碼,然後把這套程式碼放在不同平台的Qt環境去編譯,就會生成可以運行在對應平台的應用程式。例如,我在Windows寫了一個串口助手,這套程式碼不用修改,放在Linux環境下的Qt開發環境,重新編譯,就可以生成可以在Linux環境下運行的串口助手,當然,Qt支援的環境有很多。不同平台下的移植,只需要修改很小一部分或者不用修改就可以直接運行。
在這裡插入圖片描述
嵌入式Qt,即QtE,屬於Qt Embedded Linux 分支平台。Qt/E 所面對的硬體平台較多,當開發人員需要在某硬體平台上移植 Qt/E 時,需要下載Qt 源程式碼,利用交叉編譯器編譯出 Qt 庫。接著需要將 Qt 庫複製兩份,一份放置在開發主機上,供編譯使用;一份放在目標板上,供運行時動態載入使用。
在這裡插入圖片描述

2.查看開發板Qt庫的版本

要想在開發板上運行Qt程式,首先板子上要有Qt的庫,而且要確定這個的庫的版本。那麼怎麼看
開發板上的Qt庫是Qt-4.7.3版本的。可以使用find搜索命令,搜索本地所有Qt相關的文件:

#進入到根目錄  cd /    #搜索qt相關的文件  find -name "*Qt*"  #或者  find -name "*qt*"

如果搜索結果有很多so類型的文件,說明這個開發板上的系統是支援Qt的,而且後面的數字就是當前Qt庫的版本號。
在這裡插入圖片描述
可以看出,iMX287A開發板支援Qt,庫的版本是4.7.3。

3.第一個嵌入式Qt程式——Hello World

又是"Hello World",無論學習什麼東西,都要先來個"Hello World",當然Qt也不例外。

3.1 主機搭建嵌入式Qt環境

搭建一個最基本的Qt環境,需要兩個東西:qmake和編譯器。編譯器用的是交叉編譯器,我們在第一節的教程中,已經介紹了,並且已經把交叉編譯器的路徑添加到了環境變數。下面我們就來安裝用來開發嵌入式程式的qmake。

qmake包工具在光碟的位置:3、Linux2、工具軟體Linux 工具軟體qt4.7.3.tar.bz2

#進入到opt目錄  cd /opt    #解壓qmake套件,Qt-4.7.3.tar.bz2  sudo tar -jxvf qt4.7.3.tar.bz2    #添加到用戶環境變數  sudo vim ~/.bashrc    #文件末尾添加一行,$PATH放在後面,表示路徑添加在環境變數最前面  export PATH=/opt/qt4.7.3/bin/:$PATH    #使設置的環境變數生效  source ~/.bashrc    #查看當前的PATH路徑  echo $PATH    #查看當前Qt版本  qmake -v

如果本機有多個qmake,那麼一定要把嵌入式qmake路徑添加到環境變數最前面,否則不能識別
在這裡插入圖片描述
如果輸出了Qt的版本,並且所在路徑是我們設置的,說明Qt環境搭建成功。

3.2 編寫Hello World源程式

我們來編寫一個簡單的介面,程式只顯示一個標籤,標籤的內容是「Hello World」。在PC上交叉編譯之後,把可執行文件傳輸到開發板上運行。

#新建一個文件夾存放qt工程  mkdir hello_qt    #新建cpp文件  touch hello_qt.cpp    #編輯hello_qt文件  vim hello_qt.cpp

hello_qt.cpp文件的內容:

//Qt圖形庫  #include <QtGui>    int main(int argc, char *argv[])  {      QApplication app(argc,argv);      //新建一個標籤      QLabel label(QString("hello qt"));      label.show();        app.exec();  }

程式很簡單,就是新建了個標籤,文本內容是"hello qt",然後讓這個標籤show出來。下面開始編譯,生成可執行文件:

#生成.pro文件  qmake -project    #生成Makefile文件  qmake    #編譯生成可執行文件  make

在這裡插入圖片描述

這樣,就生成了hello_qt的可執行文件,可以使用file命令看一下文件類型:
在這裡插入圖片描述
支援ARM平台運行的Qt程式。

3.3 開發板運行Hello World

通過scp傳輸,NFS共享的方式把這個文件在開發板上運行:
在這裡插入圖片描述
在開發板上運行:
在這裡插入圖片描述
實際效果:
在這裡插入圖片描述

4.Linux桌面版本Qt環境的搭建

Qt 是一個跨平台的圖形框架,在安裝了桌面版本的 Qt SDK 的情況下,用戶可以先在PC 主機上進行 Qt 應用程式的開發調試,待應用程式基本成型後,再將其移植到目標板上。

桌面版本的 Qt SDK 主要包括以下兩個部分:

  • 用於桌面版本的Qt
  • Qt Creator

4.1 安裝桌面版本的Qt4

由於iMX287A官方系統內的Qt庫是Qt-4.7.3版本的庫,所以我們也要在桌面Linux安裝Qt4版本。官方的下載鏈接里,只提供了Linux版本的Qt5,而如果想安裝Linux版本的Qt4,需要自己使用源碼進行編譯。這裡提供一個簡單的方法,那就是Ubuntu自帶的命令行apt-get安裝功能,使用命令安裝Qt4版本。在使用前,請確保已經更換為中國的伺服器,否則下載速度會很慢。
在這裡插入圖片描述

#更新軟體列表  sudo apt-get update    #安裝Qt4相關的所有軟體  sudo apt-get install qt4*    #安裝QtCreator  sudo apt-get install qtcreator

耐心等待一會就安裝好了,如果安裝過程中提示缺少某個庫,那就先apt-get安裝某個庫就可以了。

4.2 配置Qt Creator的構建套件

打開工具->選項->構建和運行菜單,添加嵌入式Qt的構建套件,默認桌面環境下的Qt4構建套件已經安裝好了。我們只需要設置一下嵌入式環境下的Qt4構建套件

qmake路徑:/opt/qt4.7.3/bin/qmake    #交叉編譯gcc路徑  /opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gccc    #交叉編譯g++路徑  /opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-g++    #交叉編譯gdb路徑  /opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gdb

在這裡插入圖片描述

然後在構建套件(Kit)下新建一個構建套件

#名稱  imx287    #設備類型  同樣Linux設備    #C/C++編譯GDB  上一步設置的對應工具名稱

在這裡插入圖片描述
如果構建套件前面有紅色或黃色的感嘆號,說明構建套件沒有設置成功。

4.3 使用QtCreator涉及Hello World程式

構建套件設置完成之後,嵌入式Qt程式的開發就和桌面Qt程式的開發一樣了:

  • 新建工程時,勾選imx287構建套件:
    在這裡插入圖片描述
  • 介面設計
    在這裡插入圖片描述
  • 桌面運行效果
    在這裡插入圖片描述
  • 切換嵌入式構建套件
    如果程式效果正常,就可以切換為嵌入式構建套件,編譯出可以在嵌入式平台運行的程式了。
    在這裡插入圖片描述
    點擊下面的鎚子按鈕,就可以編譯出可以在嵌入式平台下運行的程式了。
    在這裡插入圖片描述

4.4 開發板運行Hello World

使用scp或者NFS共享目錄的方式把文件傳輸到開發板:
在這裡插入圖片描述
在開發板運行使用Qt IDE生成的可執行文件:
在這裡插入圖片描述

實際運行效果:
在這裡插入圖片描述

5.注意

  • iMX287A支援滑鼠和觸摸操作

如果想使用滑鼠來操作,要在系統上電之前,就把滑鼠插上,如果在運行過程中連接滑鼠是不能使用的。

  • 窗口大小自適應螢幕解析度和隱藏標題欄
#include <QDesktopWidget>  ...........      MainWindow::MainWindow(QWidget *parent) :      QMainWindow(parent),      ui(new Ui::MainWindow)  {      ui->setupUi(this);      //不顯示標題欄      this->setWindowFlags(Qt::FramelessWindowHint);  //    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);        //獲取螢幕解析度      const QRect availableSize = QApplication::desktop()->availableGeometry(this);      qint16 width  = availableSize.width();      qint16 height = availableSize.height();      qDebug() << "width: " << width << "height:" << height;        //重新設置窗口充滿整個螢幕      this->resize(width, height);      //設置窗口大小為螢幕的1/3  //    this->resize(width/3, height/3);        //窗口位置移動到左上角      this->move(0, 0);  }

我的公眾號:mcu149