首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux嵌入式下的QT图形界面开发(3)

linux嵌入式下的QT图形界面开发(3)

AnalogClock 类继承了Qwidget, 它有一个典型的窗体类构造函数,这个函数有父窗口对象指针和名字指针两个参数。(如果设置了名字的话,测试和调试起来就会容易些) timerEvent() 函数是从QObject (Qwidget的父类)对象继承而来的,这个函数会被系统定期调用。paintEvent() 函数是从QWidget 继承而来的并且当窗体需要重画时这个函数就会被调用。timerEvent() 和 paintEvent() 函数是“事件句柄”的两个例子。应用对象以重载父类对象的虚拟函数events (QEvent objects) 的形式接收系统的事件。大约有超过50个的系统事件是较常用的,例如 MouseButtonPress, MouseButtonRelease, KeyPress, KeyRelease, Paint, Resize 和Close. 对象可以对发给它们的事件做出响应或者筛选一些事件后再发送给别的对象。analogclock.cpp 文件是定义在analogclock.h中的函数的实现源文件
#include <qdatetime.h>
#include <qpainter.h>
#include "analogclock.h"
AnalogClock::AnalogClock( QWidget *parent, const char *name )
: QWidget( parent, name )
{
startTimer( 12000 );
resize( 100, 100 );
}
void AnalogClock::timerEvent( QTimerEvent * )
{
update();
}
void AnalogClock::paintEvent( QPaintEvent * )
{
QCOORD hourHand[8] = { 2, 0, 0, 2, -2, 0, 0, -25 };
QCOORD minuteHand[8] = { 1, 0, 0, 1, -1, 0, 0, -40 };
QTime time = QTime::currentTime();
QPainter painter( this );
painter.setWindow( -50, -50, 100, 100 );
painter.setBrush( black );
for ( int i = 0; i < 12; i++ )
{
painter.drawLine( 44, 0, 46, 0 );
painter.rotate( 30 );
}
painter.save();
painter.rotate( 30 * (time.hour() % 12) + time.minute() / 2 );
painter.drawConvexPolygon( QPointArray(4, hourHand) );
painter.restore();
painter.save();
painter.rotate( 6 * time.minute() );
painter.drawConvexPolygon( QPointArray(4, minuteHand) );
painter.restore();
}
构造函数设置窗口的尺寸大小为100 x 100,并且告诉系统每隔12秒调用一次timerEvent()函数,从而对模拟钟的窗体进行刷新。在 timerEvent()函数中, 通过调用QWidget的函数 update()就可以告诉Qt,窗体需要立即重画,紧接着Qt就会产生一个绘制事件并且调用paintEvent()函数。在paintEvent()函数中,一个Qpainter对象用于在窗体上绘制12个刻度以及分针,时针。Qpainter类提供了一种统一的方式用于绘制窗体,位图,矢量图等,它提供了绘制点,线,椭圆,多边形,弧,贝塞尔曲线等功能,一个Qpainter的坐标系可以被转变,缩放,旋转,和剪切,这样对象就可以根据它在窗口或者窗体上的位置绘制出一个剪切的视图。剪切可以使窗体绘制时减少闪烁。使用QPainter 的子类QdirectPainter可以锁定和直接访问帧缓冲区域。
文件 analogclock.h 和 analogclock.cpp 完全的定义和实现了AnalogClock 客户窗体类,这个窗体是现在就可以使用的。
#include <qapplication.h>
#include "analogclock.h"
int main( int argc, char **argv )
{
QApplication app( argc, argv );
AnalogClock *clock = new AnalogClock;
app.setMainWidget( clock );
clock->show();
return app.exec();
}

2.3.5 主窗口
QMainWindow类是为应用的主窗口提供一个摆放相关窗体的框架。一个主窗口包含了一组标准窗体的集合。主窗口的顶部包含一个菜单栏,它的下方放置着一个工具栏,工具栏可以移动到其它的停靠区域。主窗口允许停靠的位置有顶部,左边,右边和底部。工具栏可以被拖放到一个停靠的位置,从而形成一个浮动的工具面板。主窗口的下方,也就是在底部的停靠位置之下有一个状态栏。主窗口的中间区域可以包含其它的窗体。提示工具和“这是什么”帮助按钮以旁述的方式阐述了用户接口的使用方法。对于小屏幕的设备,使用Qt图形设计器定义的标准的Qwidget模板比使用主窗口类更好一些。典型的模板包含有菜单栏,工具栏,可能没有状态栏(在必要的情况下,可以用任务栏,标题栏来显示状态)

2.3.6 菜单
弹出式菜单QpopupMenu类以垂直列表的方式显示菜单项,它可以是单个的(例如上下文相关菜单),可以以菜单栏的方式出现,或者是别的弹出式菜单的子菜单出现。每个菜单项可以有一个图标,一个复选框和一个加速器(快捷键),菜单项通常对应一个动作(例如存盘),分隔器通常显示成一条竖线,它用于把一组相关联的动作菜单分立成组。
下面是一个建立包含有New,Open 和Exit 菜单项的文件菜单的例子。
QPopupMenu *fileMenu = new QPopupMenu( this );
fileMenu->insertItem( "&New", this, SLOT(newFile()), CTRL+Key_N );
fileMenu->insertItem( "&Open...", this, SLOT(open()), CTRL+Key_O );
fileMenu->insertSeparator();
fileMenu->insertItem( "E&xit", qApp, SLOT(quit()), CTRL+Key_Q );
当一个菜单项被选中,和它相关的插槽将被执行。加速器(快捷键)很少在一个没有键盘输入的设备上使用,Qt/Embedded 的典型配置并未包含对加速器的支持。上面出现的代码 “&New”意思是在桌面机器上以“New”的方式显示出来,但是在嵌入式设备上,它只会显示为“New”。 QmenuBar类实现了一个菜单栏,它会自动的设置几何尺寸并在它的父窗体的顶部显示出来,如果父窗体的宽度不够宽以致不能显示一个完整的菜单栏,那么菜单栏将会分为多行显示出来。Qt内置的布局管理能够自动的调整菜单栏。Qt的菜单系统是非常灵活的,菜单项可以被动态的使能,失效,添加或者删除。通过子类化QcustomMenuItem,我们可以建立客户化外观和功能的菜单项。

2.3.7 工具栏
QtoolButton类实现了一个带有图标,3维边框和可选标签的工具栏按钮。切换工具栏按钮具有开、关的特征,其它的按钮则执行一个命令。不同的图标用来表示按钮的活动,无效、使能模式,或者是开或关的状态。如果你仅为按钮指定了一个图标,那么Qt会使用可视提示来表现按钮不同的状态,例如按钮失效时显示灰色。工具栏按钮通常以一排的形式显示在工具栏上,对于一个有几组工具栏的应用,用户可以随便的到处移动这些工具栏,工具栏差不多可以包含所有的窗体,例如QComboBoxes 和 QspinBoxes。

2.3.8 旁述
现代的应用主要使用旁述的方式去解释用户接口的用法。Qt 提供了两种旁述的方式: “提示栏”和“这是什么”帮助按钮。 “提示栏”是小的,通常是黄色的矩形,当鼠标在窗体的一些位置游动时它就会自动出现。它主要用于解释工具栏按钮,特别是那些缺少文字标签说明的工具栏按钮的用途。下面就是如何设置一个“存盘”按钮的提示的代码。
QToolTip::add( saveButton, "Save" );
当提示字符出现之后,你还可以在状态栏显示更详细的文字说明。对于一些没有鼠标的设备(例如那些使用触点输入的设备),就不会有鼠标的光标在窗体上进行游动,这样就不能激活提示栏。对于这些设备也许就需要使用“这是什么”帮助按钮,或者使用一种姿态来表示输入设备正在进行游动,例如用按下或者握住的姿态来表示现在正在进行游动。 “这是什么”帮助按钮和提示栏有些相似,只不过前者是要用户点击它才会显示旁述。在小屏幕设备上,要想点击“这是什么”帮助按钮,具体的方法是,在靠近应用的X 窗口的关闭按钮“x”附近你会看到一个“?”符号的小按钮,这个按钮就是“这是什么”帮助按钮。一般来说,“这是什么”帮助按钮按下后要显示的提示信息应该比提示栏要多一些。下面是设置一个存盘按钮的“这是什么”文本提示信息的方法:
QWhatsThis::add( saveButton, "Saves the current file." );
QToolTip 和 QWhatsThis 类提供了虚拟函数以供开发者重新实现更多的特定的用途。Qtopia并未使用上述提及的两种帮助(旁述)机制。它在应用窗口的标题栏上放置一个“?”符号的按钮来代替上述的旁述机制,这个“?”按钮可以启动一个浏览器来显示和当前应用相关的HTML页面。Qtopia使用按下和握住的姿态来调用上下文菜单(右击)和属性对话框。

2.3.9 动作
应用程序通常提供给用户几种不同的方式去执行特别的动作。例如,大部分应用提供了一个“Save”动作给用于存盘的菜单(File|Save)以及工具栏(一个“软盘”图标的工具栏按钮)和快捷键(Ctrl+S)。Qaction类可以让上述过程变得简洁,它允许程序员在一个地方定义一个动作,然后把这个动作加入到菜单或者工具栏,这个过程与把菜单项加入到菜单的道理是一样的。
下面的代码实现了一个“Save”菜单项和一个“Save”工具按钮,旁述系统和快捷键可
以很容易的添加进去,但是我们没添加,因为它们很少在嵌入式设备上使用。
QAction *saveAct = new QAction( this );
saveAct->setText( "Save" );
saveAct->setIconSet( QPixmap("save.png") );
connect( saveAct, SIGNAL(activated()), this, SLOT(save()) );
saveAct->addTo( fileMenu );
saveAct->addTo( toolbar );
除了不用复制代码,使用Qaction 还可以确保菜单的状态与工具栏按钮的状态保持一致,必要的时候还可显示提示栏。使一个动作(Action)失效将导致和该动作相关联的菜单项以及工具按钮的失效。同样的,如果用户切换一个工具按钮的状态,那么相关的菜单项的也会跟着被选中或不选中。
继承事业,薪火相传
返回列表