找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

LibQQt系列之一QQtApplication

admin 2019-11-28 15:39 176人围观 Qt相关

点击标题下「蓝色微信名」可快速关注



Qt在嵌入式领域的应用非常广泛,作为一名嵌入式软件工程师,经常会使用Qt写不同的项目,但是很多环境或设置都是相通的,如果每次都进行设置会很浪费时间,那有没有什么模板类的文件可以直接拿来使用呢?今天要讲的LibQQt就是这样的一个开源项目。

QQt应用程序框架软件,英文简称LibQQt。QQt应用程序框架软件是应用程序框架层的一系列库集合,持续实现这一层的功能。主库是LibQQt,辅助(平级扩展)库有QQtExquisite、QQtHighGrade、QQtIndustrialControl、QQtInput、QQtInstallFramework、QQtMediaExtention、QQtStyle、QQtTool等,很多流行Qt Wrapper库都在辅助库中。全部使用Multi-link技术实施工程管理。

 现在,我们就来跟随作者DrAbel的脚步,看看这个开源项目到底是什么?希望对从事嵌入式开发的朋友有所帮助。

作者介绍

作者:DrAbel,嵌入式软件工程师。


写模块化的代码,做有组织的工程,创品格的产品。 写工整的代码,创高档逻辑性的架构。 用设备、做技术、出产品、造标准。


博客地址:

https://blog.csdn.net/Dr_Abel/article/details/78621107


项目地址:

https://gitee.com/drabel/LibQQt




Qt本身支持MIPS、ARM,LibQQt是一款应用程序开发框架,基于Qt,能够帮助非软件专业开发者开发出完整的工业应用。 开发一个App要解决的问题很多,Qt提供了通俗的框架,可是专业开发,要对Qt进行正确的使用。

LibQQt就解决这个正确使用的问题。作为一种Framework,LibQQt提供对Qt的一种正确的科学的使用方式。

好,说QQtApplication。QApplication是程序的主入口调用的第一个类,为什么要对她进行继承和加入功能呢? 简单说来就是对整个App系统的初始化,细致说来QApplication提供了程序主入口的功能,但是设置谁来做呢?做在main函数里吗?如果你新开发了一个App,也要用这些相同的设置怎么办?从main函数拷贝?还不如拷贝QQtApplication文件呢,里面设置全活的。

下面看看QQtApplication的功能。

编码转换设置
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
    QTextCodec::setCodecForTr ( QTextCodec::codecForName ( "UTF-8" ) );
    QTextCodec::setCodecForCStrings ( QTextCodec::codecForName ( "UTF-8" ) );
#endif
    QTextCodec::setCodecForLocale ( QTextCodec::codecForName ( "UTF-8" ) );

上来就是这一句,这是做QtApp最重要的一段代码,设置系统的编码在Qt当中,文件编码为UTF-8,tr当中使用英文,中文不允许在tr中使用,代码里的子串编码和解码问题全部通过CODE1 - UNICODE - CODE2,这样的形式进行解析,乱码的问题是不可能出现的。

这一句设置Qt系统编码的语句放在QtApplication当中,更换工程就可以直接拷贝QQtApplication源文件和头文件, 你相信不相信?如果你不设置这句话,linux系统下编码转换还正常的函数,到了windows下之后就乱码了。设置下,就不会乱码。如果你不相信可以尝试尝试,试错也是进步的。 Qt4函数有三个,Qt5只有一个。QQtApplication里面用宏分开了。

配置文件路径
QCoreApplication::setOrganizationName ( COMPANY_NAME );
QCoreApplication::setOrganizationDomain ( COMPANY_DOMAIN ); // 专为Mac OS X 准备的
QCoreApplication::setApplicationName ( PRODUCT_NAME );
QSettings::setPath ( QSettings::NativeFormat, QSettings::UserScope, CONFIG_PATH );
QSettings::setPath ( QSettings::NativeFormat, QSettings::SystemScope, CONFIG_PATH );

有些人真的认为这些设置都是多余的。 那么这个设置是什么意思呢?设置OrganizationName,配置文件会保存在这个子目录里,设置ApplicationName,配置文件的名字就是这个。SetPath,配置文件会保存在这个路径。

有的人认为这些设置没用,你不做完整的工程,这些功能你都用不到,你说没用,别的人可不会认为没用,你写写完整的工程试试,看看会不会没用。(在嵌入式板子上,Qt4.8.7,这个不设置会没有AppName, Qt5.9.2确有的。)

日志系统初始化
QQtApplication会把日志打印到终端,并且保存到日志,利用这条函数。一天保存一个文件。兼容Qt4、Qt5。
#ifdef __QQTLOGFILESUPPORT__
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
    qInstallMsgHandler ( QQt4FrameMsgHandler );
#else
    qInstallMessageHandler ( QQt5FrameMsgHandler );
#endif
#endif

初始化串口的使用
#ifdef __EMBEDDED_LINUX__
    system ( "rm -f /tmp/LCK..ttyS*" );
#endif

为什么要删除这个文件呢?如果不删除,在嵌入式linux设备上,你第二次打开程序如果和第一次打开程序间隔时间很短,如果不删除这个文件,就会提示串口正在被占用而打开失败。这句话是很重要的。删除这个LCK,每次开启程序保准打开串口成功。

设置语言
language = new QTranslator ( this );
setLanguage();

这句话如果没有的话,你将无处更改语言,除非你重写每个内部类的event函数。

随机数初始化
qsrand ( QTime ( 0, 0, 0 ).secsTo ( QTime::currentTime() ) );

这句话不必说太多,谁都明白,随机数最初必须设置一个种子,后来的qrand才不会出现重复现象。

隐藏鼠标
#ifdef __EMBEDDED_LINUX__
    //QApplication::setOverrideCursor(Qt::ArrowCursor);
    QWSServer::setCursorVisible ( false );
#endif

在嵌入式平台上,必须经过此处设置鼠标不可见。可是你知道吗,这还不够,你必须修改Qt源代码,Qt源代码初始化鼠标的时候,对背景的重绘不科学,必须屏蔽掉那块代码,在嵌入式板子上才会真正的实现 开机看不到鼠标闪烁!

输入法初始化
#ifdef __EMBEDDED_LINUX__
    QQtInput::Instance()->Init ( "min", "control", "QQT", 14, 14 );
#endif

这个比较好理解,Qt在嵌入式屏幕上才开始开放KeyBoard版权,过去的时候都是自己写,找网络大牛买。

热插拔检测初始化
#ifdef __PLUGINWATCHER__
    QObject::connect ( QQtPluginWatcher::Instance(), SIGNAL ( storageChanged ( int ) ),
                       this, SLOT ( slotUPanAutoRun ( int ) ) );
#endif

这条是有个功能需求,如果U盘插到设备上,要自动扫描升级包提醒用户进行设备升级。如果不需要把宏开关关掉。in qqt_header.pri

设置主题
setQSSStyle()

只有在这里设置QSS,才会全局更换主题,在别处,只是调用此处。因为你要把qss文件设置到QApplication才有意义。

设置App默认字体
setTextFont

这个和上一个原因一样。

好了,这就是QQtApplication。

结语

同学们,不要觉得嵌入式开发简单,也不要被他吓住,一步步设置,一步步完成,肯定能开发出完美的专业应用的。


可以点击下方“阅读原文”访问作者博客。




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:yafeilinux和他的朋友们,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......