本篇来介绍在OK3568开发板上运行一个编写Qt时钟程序。
因为Qt是支持跨平台的,可以先在Windows平台上编写和查看Qt的运行效果,然后再通过交叉编译,编译出ARM Linux平台的可执行文件,最终放到开发板中查看运行结果。
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();
是来获取系统的当前时间。
现在Windows平台中编译运行,查看效果:
在Ubuntu中使用RK3568的编译工具链进行交叉编译,然后将编译文件放到OK3568板子中运行。
运行效果如下:
本篇介绍了在OK3568开发板上运行一个编写Qt时钟程序。
更多回帖