源碼下載
網址:qt-everywhere-opensource-src-5.5.1.tar.gz
配置生成MakeFile 文件
解壓源碼包,在源碼包路徑下生成配置 MakeFile :
./configure -prefix /home/qt-5.5.1 -release -opensource -confirm-license -static \
-platform linux-g++ -xplatform linux-himix200-linux-g++ \
-qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -no-pch -no-avx -no-openssl \
-no-cups -no-dbus -no-opengl -no-glib -skip qtwebchannel -skip qtcanvas3d -skip qtwebkit \
-mtdev -evdev -nomake examples -nomake tests
- -prefix /home/qt-5.5.1 指定最終的安裝路徑為
/home/qt-5.5.1; - -static 來生成靜態庫是為了方便程序在板端運行,減少對庫加載路徑的配置以及文件目錄的掛載。執行程序時不需要再設置一堆的環境變量以及掛載庫的路徑;
- -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype 這幾個選項最好使用qt庫自帶的源碼,不然如果系統上沒有這個庫或者找不到,自行編譯這些庫后再加入到相關路徑上還需要為這些庫寫依賴文件才能使用,沒有依賴文件,鏈接程序時會報一些插件找不到的錯誤;
- -platform linux-g++ 指的是你在什么機器上編譯這些文件;
- -xplatform 指的是程序要運行在什么平台,linux-g++會用來編譯一些使用工具;
- -mtdev 用於多點觸摸,-evdev 用於鼠標鍵盤;
生成 MakeFile 文件之后,依次進行:
make
make install
make編譯完后, 會生成若干Qt的.a文件,這里說下qt的核心庫會被編譯在qt-everywhere-opensource-src-5.5.1/qtbase/lib目錄下,而fb以及圖像支持的庫入libjpeg和libgif等庫都是以插件的形式存在的,放在qt-everywhere-opensource-src-5.5.1/qtbase/src/plugins目錄下。
Qt庫對接海思平台
linuxfb 插件修改重編譯
arm上使用的繪圖后端一般都是linuxfb這個插件,在海思上使用fb之前需要先做一些初始化的工作,需要先初始化MPP系統以及VO,不然直接打開fb會報權限不允許的錯誤。
在此我們可以通過修改qt-everywhere-opensource-src-5.5.1/qtbase/src/plugins/platforms/linuxfb,添加MPP,VO初始化的工作。之后再執行:
make
make install
這時linuxfb插件就可以適配海思平台,此部分的修改參考文末的下載程序。
交叉編譯環境配置
點擊qtCeator菜單欄的Tools->option->Build&Run,配置交叉編譯環境:
- Compliers選項,增加一個編譯器,配置該編譯器的路徑為相應的
arm-himix200-linux-g++的路徑,,我的路徑是arm-himix200-linux/bin/下。 - Qt Versions選項,增加一個qmake工具,Qt中通過qmake編譯.pro文件來生成Makefile。配置該qmake工具路徑為
qt-5.5.1/bin/qmake, 該qmake是使用arm-himix200-linux-g++編譯后生成的工具類,專門使用在3519平台上,用於生成相應的Makefile。 - Kits,增加一個Kit,在compiler和Qt Version中選中步驟1,2中配置的選項。
測試
創建一個簡單的qt程序,在.pro中添加海思相關的庫和頭文件,並使用qmake手動生成makefile:
qt-5.5.1/bin/qmake *.pro -o Makefile
接着make並生成可執行文件,將文件拷貝到nfs系統的/home目錄下,工程可以參考文末的下載程序,接着就可以執行程序。
hifb 疊加
目的是將qt的GUI與海思的MPI分離,在視頻層上疊加上圖形層。
此部分的工作,需要在linuxfb上啟用hifb。
另外,設置QT界面透明顯示
(1) 修改qt-everywhere-opensource-src-5.5.1/qtbase/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp:
for (int i = 0; i < rects.size(); i++)
{
// -
//mBlitter->drawImage(rects[i], *mScreenImage, rects[i]);
// +
mBlitter->setCompositionMode(QPainter::CompositionMode_Source);
mBlitter->drawImage(rects[i], *mScreenImage, rects[i]);
mBlitter->setCompositionMode(QPainter::CompositionMode_SourceOver);
}
(2) 修改qtbase\src\platformsupport\fbconvenience\qfbscreen.cpp:
// -
//mCompositePainter->fillRect(rect, Qt::black);
//+
mCompositePainter->setCompositionMode(QPainter::CompositionMode_Source);
mCompositePainter->fillRect(rect, Qt::transparent);
mCompositePainter->setCompositionMode(QPainter::CompositionMode_SourceOver);
(3) 修改qt程序
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlags(Qt::CustomizeWindowHint);
}
