上篇文章介紹了如何搭建在Linux開發闆中搭建Qt的運作環境,并測試了Qt自帶的例程。
本篇,來介紹如何自己編寫一個Qt程式,并将編譯結果放到Linux開發闆中運作。
1 Windows上編寫Qt程式
因為Qt是支援跨平台的,是以我們可以先在Windows平台上編寫和檢視Qt的運作效果,然後再通過交叉編譯,編譯出ARM Linux平台的可執行檔案,最終放到開發闆中檢視運作結果。
Windows上需要安裝Qt Creator軟體來開發Qt程式,該軟體的安裝過程,和大多數軟體的安裝過程都差不多,在此不再示範安裝過程。
下面介紹如何建立一個Qt工程。
1.1 建立Qt工程
Qt Creator本質也是一個內建開發環境,與Visual Studio之類的建立工程的流程類似,其軟體界面如下:
建立工程,選擇左上角菜單中的“檔案”->“建立檔案或項目”,彈出如下視窗,然後預設選擇Qt Widgets Application,然後右下加點選“Choose"按鍵:
出現選擇項目工程的存放位置,然後再下一步:
這裡會用到Visual Studio中的一些功能,預設即可,然後下一步:
然後要選擇類資訊,基類裡可選的有QMainWindow、QWidget和QDialog,這裡我們選擇QWidget。
下面還有一個”建立界面“的勾選框,那個是用來通過圖形化的方式設計顯示界面,本篇暫用不到,先取消勾選,然後點下一步
到這裡,Qt工程就建立好了,點完成:
建立的Qt工程如下,主要包含4個檔案:
- clock.pro:Qt工程的配置檔案
- main.cpp:主程式
- widget.cpp:視窗程式
- widget.h:視窗程式的頭檔案
1.2 代碼編寫(時鐘程式)
Widget的構造函數
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
setWindowTitle(tr("Clock"));
setMinimumSize(200, 200); //設定最小尺寸
}
首先建立了一個Qt的定時器,設定逾時時間為1s(1000ms),逾時時間到,更新表盤的顯示。
第2行是Qt中最常用的信号和槽機制:
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
信号和槽,簡單的立即,就是信号SIGNAL出現後(1s定時器逾時),觸發槽SLOT函數執行(更新表盤的顯示)
界面設計
時鐘程式中的表盤,表針等,都是通過畫圖的方式實作的,具體的代碼如下:
void Widget::paintEvent(QPaintEvent *event)
{
int side = qMin(width(), height());
QTime time = QTime::currentTime();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(width()/2, height()/2); //畫圖的基準位置
painter.scale(side/200.0, side/200.0); //随視窗尺寸自動縮放
//表盤
for (int i=0; i<PANEL_RADIUS_NUM; i++)
{
QBrush brush(stPanelParaArr[i].color);
QPen pen(stPanelParaArr[i].color);
painter.setBrush(brush);
painter.setPen(pen);
painter.drawEllipse(-stPanelParaArr[i].radius, -stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius);
}
//小時的表針
painter.setPen(Qt::NoPen);
painter.setBrush(hourColor);
painter.save();
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
//小時的刻度
painter.setPen(hourColor);
for (int i = 0; i < 12; ++i)
{
painter.rotate(30.0);
painter.drawLine(PANEL_RADIUS3-6, 0, PANEL_RADIUS3, 0);
QFont font("TimesNewRoman", HOUR_NUM_SIZE);
painter.setFont(font);
painter.drawText(-HOUR_NUM_SIZE, -(CLOCK_RADIUS-15), 2*HOUR_NUM_SIZE, 2*HOUR_NUM_SIZE, Qt::AlignHCenter, QString::number(i+1));
}
//分鐘的表針
painter.setPen(Qt::NoPen);
painter.setBrush(minuteColor);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
painter.setPen(minuteColor);
for (int j = 0; j < 60; ++j)
{
if ((j % 5) != 0)
{
painter.drawLine(PANEL_RADIUS3-4, 0, PANEL_RADIUS3, 0);
}
painter.rotate(6.0);
}
//秒鐘的表針
painter.setPen(Qt::NoPen);
painter.setBrush(secondColor);
painter.save();
painter.rotate(6.0 * time.second());
painter.drawConvexPolygon(secondHand, 3);
painter.restore();
painter.end();
}
第2句:
QTime time = QTime::currentTime();
是來擷取系統的目前時間。
1.3 編譯運作
現在Windows平台中編譯運作,檢視效果:
該時鐘是可以根據視窗大小的變化,自動進行放到或縮小顯示的:
2 Ubuntu中交叉編譯Qt
Windows中測試通過後,就需要編譯出能夠在ARM平台運作的可執行程式了,這裡需要在Ubuntu中進行編譯。
2.1 複制源檔案到Ubuntu中
将Windows中的QT工程源碼,複制到Ubuntu中,注意.user檔案是不需要的,這個是Windows平台的編譯配置。
複制到Ubuntu中的合适位置:
2.2 交叉編譯
編譯ARM平台的Qt程式,需要使用ARM平台的編譯工具鍊。
上篇文章,在搭建Qt環境,編譯Qt源碼時,已經生成了ARM平台的Qt編譯工具鍊,其位置是在上篇文章介紹的make install那一步的安裝位置,我的是在”/home/xxpcb/myTest/imx6ull/otherlib/qt/qt-everywhere-src-5.12.9/arm-qt/“,這裡需要先用到它的qmake工具先自動生成Makefile檔案,再通過make指令進行編譯。
首先的使用qmake生成Makefile,進入程式源碼目錄,執行qmake指令:
/home/xxpcb/myTest/imx6ull/otherlib/qt/qt-everywhere-src-5.12.9/arm-qt/bin/qmake
成功執行之後,就可以看到自動生成的Makefile檔案:
然後執行make指令進行編譯:
make
編譯完可以看到可執行檔案clock。
我們可以再使用file指令檢視該可執行檔案的平台資訊:
file clock
可以看到該可執行檔案是ARM平台的。
3 Linux開發闆中運作Qt程式
3.1 複制可執行檔案到開發闆中
此次測試,仍然使用的是網絡位置挂載根檔案系統的方式,通過如下指令将可執行檔案複制到根檔案系統中(開發闆中):
sudo cp clock ~/myTest/nfs/rootfs/myProj/qt/mytest/
3.2 檢視開發闆中的運作效果
然後就可以在開發闆中執行該程式,檢視效果了:
./clock
運作效果如下:
由于闆子的網絡時間還不能正确擷取,這裡顯示的時間其實是不對的,不過表針仍然會1秒1秒的走動。
4 總結
本篇詳細介紹了如何自己編寫一個Qt程式,如何通過交叉編譯,最終放到開發闆中執行的過程。