飞凌嵌入式
直播中

fsdzdzy

10年用户 260经验值
擅长:嵌入式技术 控制/MCU opencv
私信 关注
[技术]

【飞凌RK3568开发板试用体验】16-Qt时钟测试

本篇来介绍在OK3568开发板上运行一个编写Qt时钟程序。

1 Windows上编写Qt程序

因为Qt是支持跨平台的,可以先在Windows平台上编写和查看Qt的运行效果,然后再通过交叉编译,编译出ARM Linux平台的可执行文件,最终放到开发板中查看运行结果。

1.1 代码编写(时钟程序)

1.1.1 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函数执行(更新表盘的显示)

1.1.2 界面设计

时钟程序中的表盘,表针等,都是通过画图的方式实现的,具体的代码如下:

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.2 编译运行

现在Windows平台中编译运行,查看效果:

2 测试

在Ubuntu中使用RK3568的编译工具链进行交叉编译,然后将编译文件放到OK3568板子中运行。
运行效果如下:

1.png

3 总结

本篇介绍了在OK3568开发板上运行一个编写Qt时钟程序。

更多回帖

发帖
×
20
完善资料,
赚取积分