王莉莉
(苏州工业职业技术学院,江苏 苏州 215104)
基于Qt的温度计界面设计
王莉莉
(苏州工业职业技术学院,江苏 苏州 215104)
摘要:Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。本文介绍的基于Qt的温度计可以显示温度,并实现摄氏温度与华氏温度之间的转换,并分别显示出来。
关键词:Qt;温度计界面;华氏温度;摄氏温度
Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler,moc))以及一些宏,易于扩展,允许组件编程。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功应用程序的基础。Qt也是流行的Linux桌面环境KDE的基础。基本上,Qt同X Window上的 Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的,但Qt具有优良的跨平台特性、面向对象、丰富的API、大量的开发文档等优点[1]。
1设计要求
利用Qt实现具有图1所示的界面的窗体。该窗体左侧的滑动条用于调整摄氏温度的值,右侧的表盘用于调整华氏温度的值。当调整摄氏温度的值时,编程使滑动条上方的标签显示当前的温度值,并使表盘同步显示对应的华氏温度。当使用表盘调整华氏温度时,编程使段码液晶显示当前的华氏温度,并使滑动条同步显示对应的摄氏温度。
图1 温度计界面
2设计原理
本设计中,需要有实现温度转换计的界面,并实现摄氏温度与华氏温度之间的关联,使当二者中的一个发生变化时另外一个可以随之变化。本设计需使用5个控件,它们的布局如图2所示。
图2 控件布局
可以看出,Label和Slider可以使用一个垂直布局器;Dial和LCDNumber也可以使用一个垂直布局器,而两个垂直布局器之间形成了水平的布局关系,最后,和PushButton一起,又形成了一个垂直布局。可以使用图3所示的几个布局器来设计界面。
图3 温度转换界面布局拆分图
摄氏温标(Celsius)和华氏温标(Fahrenheit)是两种不同的温度测量标准
F=(C*9/5)+32.
C=(F-32)*5/9 .
其中:F表示华氏温度,C表示摄氏温度。
当滑动条发生变化时,要求标签可以显示当前的摄氏温度值,所以,可以使用下面的代码设置标签显示当前摄氏温度值:
ui->label->setNum(ui->verticalSlider->value());
同时,还需要计算华氏温度的值,并修改表盘的当前值:ui->dial->setValue(ui->verticalSlider->value()*9/5+32);
同样,当表盘发生变化时,要求液晶显示部件可以显示当前的华氏温度值,所以,可以使用下面的代码设置液晶显示部件显示当前华氏温度值:
ui->lcdNumber->display(ui->dial->value());
同时,还需要计算对应的摄氏温度,并修改滑动条:
ui->verticalSlider->setValue((ui->dial->value()-32)*5/9);
3设计过程
1) 在Qt Creator中新建一个工程,并命名为TempM;
2) 在主窗体中,按照设计界面布局要求,依次添加按钮、标签、垂直滑动条、LCDNumber、表盘,并将它们的位置先做大概布局。利用垂直布局按钮将Label和滑动条Slider二者组织起来。使用同样的方法,将LCDNumber 和表盘也使用一个垂直布局器组织起来,然后用同样的方法将最上面的PushButton一起组织起来。至此界面设计即完成。
3) 接下来开始关联各个部件之间的动作。由于在该设计中,需要执行的动作比较复杂,并不是简单的将两个部件连接就可以完成,所以需要编写代码来完成这些动作;首先编写当滑动条变化时,将摄氏温度转换为华氏温度的代码。使用鼠标右击滑动条。
右击滑动条在弹出的快捷菜单中选择“Go to slot...”;将弹出图4所示的对话框,其中列出了滑动条能够产生的信号,选择“valueChanged(int)”,该信号是在滑动条的值被改变时产生,然后点击“OK”;
图4 为表盘添加信号处理函数
4) 部分软件编程。主程序如下:
/main.cpp:
#include
#include "ConversionScreen.h"
int main(int argc, char *argv)
{
QApplication app(argc, argv);
ConversionScreen w;
w.show();
return app.exec();
}
在ConversionScreen.h中,声明了ConversionScreen类,在这个类中声明了设计界面所用到的部件,以及进行温度转换所需要的槽函数,在这里用到了两个槽,CelTlFah实现摄氏温度到华氏温度的转换,FahToCel实现华氏温度到摄氏温度的转换[2,3],代码如下所示:
//ConversionScreen.h
#ifndef CONVERSIONSCREEN_H
#define CONVERSIONSCREEN_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
class ConversionScreen : public QWidget
{
Q_OBJECT
public:
ConversionScreen(QWidget *parent = 0);
~ConversionScreen();
private slots:
void CelToFah(int celNum);
void FahToCel(int fahNum);
private:
void CreateScreen();
void CreateCel();
void CreateFah();
QSlider* slider;
QDial* dial;
QHBoxLayout* celLayout;
QVBoxLayout* fahLayout;
};
#endif // CONVERSIONSCREEN_H
在ConversionScreen.cpp中对ConversionScreen类进行了实现,其代码如下所示:
#include "ConversionScreen.h"
ConversionScreen::ConversionScreen(QWidget *parent): QWidget(parent)
{
CreateScreen();
}
ConversionScreen::~ConversionScreen()
{
}
void ConversionScreen::CreateScreen()
{
QPushButton* quit = new QPushButton(tr("quit"));//创建“quit”按钮
CreateCel();
CreateFah();
QGridLayout *mainLayout = new QGridLayout; //创建网状布局
mainLayout->addWidget(quit, 0, 0);
mainLayout->addLayout(celLayout, 1, 0);
mainLayout->addLayout(fahLayout, 1, 1);
mainLayout->setSpacing(40);
mainLayout->setMargin(40);
setLayout(mainLayout);
slider->setFocus();
华氏温度和摄氏温度转换子函数为:
void ConversionScreen::CelToFah(int celNum)
{
int fahNum = (celNum * 9 / 5) + 32;
dial->setValue(fahNum);
}
void ConversionScreen::FahToCel(int fahNum)
{
int celNum = (fahNum - 32) * 5 / 9;
slider->setValue(celNum);
}
5) 实验箱平台显示
本设计交叉编译调试环境为凌阳的A8实验箱为三星S5PV210,其为ARM A8架构的处理器。GNU编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标机,从而建立开发环境。所以在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的PC 机作宿主开发机。嵌入式开发通常要求宿主机配置有网络,支持NFS(为交叉开发时mount 所用)。然后要在宿主机上建立交叉编译调试的开发环境。
接下来编译用于实验箱运行的Qt应用程序,首先将实验箱的串口和网线连接到PC机。执行Qt Creator的Build/Clean All,清理之前生产的编译文件。单击左下角所示的图标,会弹出编译选择框。点击“Build”右侧的下拉列表,在弹出的四种编译类型中,选择“Qt for A8 Release”。点击“Build All”按钮,即可开始编译实验箱运行的版本,直到编译选择按钮上方的进度条变成绿色,即表示编译完成。并在工程的保存目录下,可以找到一个名为“TEMPM-build-desktop”的文件夹。编译生成的可执行程序即在此文件夹中[4]。
将TEMPM-build-desktop 文件夹中的TEMPM 文件复制到Windows 下,将TEMPM下载到实验箱;在超级终端中,利用chmod 777 TEMPM为TEMPM添加可执行权限,并运行它。
在实验箱上使用触摸屏即可对应用程序进行操作。
4结束语
随着嵌入式系统的飞速发展,其应用已经渗透到人们生活的每一个领域。大到军事领域,小到小朋友的玩具,它正在以不同的形式悄悄地改变着人们的生产、生活方式。arm嵌入式很多都是运行的嵌入式linux系统,在linux系统上可以用Qt来开发可视化窗口界面程序。因此对Qt的探讨有着十分重要的意义。
参考文献
[1]蔡志明,卢传富.精通Qt4编程[M].第2版.北京:电子工业出版社,2011.
[2]李春葆,陶红艳.C++程序设计教程[M].北京:清华大学出版社,2007.
[3]华清远见嵌入式培训中心.嵌入式Linux C编程入门[M].北京:人民邮电出版社,2009.
[4]凌阳科技.A8实验箱——Linux平台篇[OL].[2014/08/25]http://www.unsp.com
The Design of Thermometer Interface Based on Qt
Wang Lili
(SuzhouInstituteofIndustrialTechnology,SuzhouJiangsu215104,China)
Abstract:Qt is an application framework of cross platform base on C++ graphical user interface. It provides all the functions for application developers to create an art level graphical user interface. It is fully object-oriented, easy to be expanded and allows the real component programming. In this paper, the thermometer designed based on Qt can display temperature and achieve the conversion between Celsius temperature and Fahrenheit temperature, and then show it.
Key words:Qt; thermometer interface; Fahrenheit temperature; Celsius temperature
中图分类号:TP311.52;TP273
文献标识码:A
文章编号:1674- 4578(2016)01- 0055- 03
作者简介:王莉莉(1980- ),女,江苏徐州,讲师,研究方向为电子信息技术。
收稿日期:2015-11-12