Qt GUI 应用于机顶盒的初步探索
时间:2010-09-17 来源:jiangjqian
前后一个多星期的调研,初步总结如下:
1. Qt应用于机顶盒,差异于PC环境,必须构建可应用于电视机显示和遥控器控制的风格(Style)和组件(Widget)。
2. 需要考虑裁剪Qt以便适应嵌入式较为有限的存储空间,关于这方面的探讨估计已经比较普遍。
3. Qt灵活和强大,同时也庞大而需要较多时间熟悉,以便发挥到极致。
下面记录相关细节,以便将来或后面的人参考:
一: 关于Qt的学习
像开源社区许多技术都有不少经典书籍一样,Qt的经典是<<C++ GUI Programming With Qt 4, Second Edition>>,能够点出技术的核心,并且循序渐进。
另外,Qt相比MFC,更加合理,易懂。
二:安装
qt.nokia.com/downloads选择"for linux/x11"下载,chmod +x,运行即可。如果缺少支撑包,apt-get即可。
三:Qt建立机顶盒GUI的探索
这里的探索主要包括几个问题的解决。
A. QComboBox(复选框) -- 探讨Custom Style和Custom Widgets
PC风格的复选框由鼠标点击出现下拉框,而机顶盒是遥控器左右按钮控制。
I. 创建适应于机顶盒的ComboBox控件
可以继承QComboBox,实现虚函数:
1) HpComboBox::sizeHint(),使之宽度增加以便放置左箭头
2) HpComboBox::paintEvent(),调整CE_ComboBoxLabel的显示区间使之左移
3) HpCombboBox::KeypressEvent(),使左右按键映射到上下按键
II. 创建适应于机顶盒的Style
因为我们在paintEvent中使用了QStylePainter类中的drawComplexControl()和drawControl()方法,需要修改方法中对ComboBox构建的显示。实验时直接引用了Qt源码中window style的源码,并修改drawComplexControl()中CC_ComboBox部分的实现。
实际项目中应该是建立一个新的style类,并且继承qwindowstyle,对类似drawComplexControl()等虚函数定义自身的方法。
新的Style的使用,通过方法QApplication::SetStyle(new hpStyle)引用
B. 探讨style sheet
style sheet可以调整组件的颜色,几何属性,字体等,类似HTML中的Style,正因为如此使得Qt命名适得其所。而在机顶盒的GUI构建中,需要大量应用该功能以求美观和时尚。这里要提的是,我们可以通过修改Parent Frame的style sheet,而免去对所有的Child widget进行同等的修改。参考:"Qt Stylesheets Tutorial" - http://thesmithfam.org/blog/2009/09/10/qt-stylesheets-tutorial/
Picture1: STB GUI designed by Qt
四:关于Qt designer
上图通过Qt designer画出,目前Custom style和Custom Widget加入到designer中遇到困难。目前的方法是按照标准组件画出来后,通过.ui文件生成.h文件,然后把文件中的标准组件类替换成自定义的组件类。如下:
========================================================================
sed 's/QComboBox/HpComboBox/g' ui_autosearch.h > temp
sed 's/<QtGui\/HpComboBox>/"hpcombobox.h"/g' temp > ui_autosearch.h
========================================================================
附件:
附件stb-styles.tar,相关图片没有放置在里面,仅供参考。
autosearch* --- autosearch dialog, qt designer生成
hpstyle.h,qwindowsstyle.cpp,qstylehelper*,qwindowsstyle_p.h, qcommonstyle_p.h,qstyle_p.h --- 源自于Qt源码中qwindowstyle的实现,修改成hpstyle
images --- 相关图片,未放置到tar中
hpcombobox* --- HpComboBox的实现
widgetgallery.*, norwegianwoodstyle.* --- 源自于Qt中的一个例子,用于展示Custom Style的实现
replace --- "sh replace" 对标准组件类进行替换