天天看點

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

上篇文章介紹了如何搭建在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-動手編寫并運作自己的第1個ARM-Qt程式

建立工程,選擇左上角菜單中的“檔案”->“建立檔案或項目”,彈出如下視窗,然後預設選擇Qt Widgets Application,然後右下加點選“Choose"按鍵:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

出現選擇項目工程的存放位置,然後再下一步:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

這裡會用到Visual Studio中的一些功能,預設即可,然後下一步:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

然後要選擇類資訊,基類裡可選的有QMainWindow、QWidget和QDialog,這裡我們選擇QWidget。

下面還有一個”建立界面“的勾選框,那個是用來通過圖形化的方式設計顯示界面,本篇暫用不到,先取消勾選,然後點下一步

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

到這裡,Qt工程就建立好了,點完成:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

建立的Qt工程如下,主要包含4個檔案:

  • clock.pro:Qt工程的配置檔案
  • main.cpp:主程式
  • widget.cpp:視窗程式
  • widget.h:視窗程式的頭檔案
嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

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平台中編譯運作,檢視效果:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

該時鐘是可以根據視窗大小的變化,自動進行放到或縮小顯示的:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

2 Ubuntu中交叉編譯Qt

Windows中測試通過後,就需要編譯出能夠在ARM平台運作的可執行程式了,這裡需要在Ubuntu中進行編譯。

2.1 複制源檔案到Ubuntu中

将Windows中的QT工程源碼,複制到Ubuntu中,注意.user檔案是不需要的,這個是Windows平台的編譯配置。

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

複制到Ubuntu中的合适位置:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

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檔案:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

然後執行make指令進行編譯:

make      
嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

編譯完可以看到可執行檔案clock。

我們可以再使用file指令檢視該可執行檔案的平台資訊:

file clock      
嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

可以看到該可執行檔案是ARM平台的。

3 Linux開發闆中運作Qt程式

3.1 複制可執行檔案到開發闆中

此次測試,仍然使用的是網絡位置挂載根檔案系統的方式,通過如下指令将可執行檔案複制到根檔案系統中(開發闆中):

sudo cp clock ~/myTest/nfs/rootfs/myProj/qt/mytest/      
嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

3.2 檢視開發闆中的運作效果

然後就可以在開發闆中執行該程式,檢視效果了:

./clock      

運作效果如下:

嵌入式Qt-動手編寫并運作自己的第1個ARM-Qt程式

由于闆子的網絡時間還不能正确擷取,這裡顯示的時間其實是不對的,不過表針仍然會1秒1秒的走動。

4 總結

本篇詳細介紹了如何自己編寫一個Qt程式,如何通過交叉編譯,最終放到開發闆中執行的過程。

繼續閱讀