频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

12.4.5 使用其他窗口部件

作者: [美] Hal Fulton著 陈秋萍等译 出处:人民邮电出版社  2007-11-23 11:40    砖    好    评论   进入论坛
阅读提示:《The Ruby Way(第二版)中文版》第12章介绍的是最重要、最成熟的系统,关于Tk、GTK+、FOX和Qt。本文是使用其他窗口部件。

12.4.5  使用其他窗口部件

Qt还提供了很多其他的GUI通用窗口部件,如单选按钮、复选框和其他用于显示的窗口部件。程序清单12.16演示了其中的一些,图12.9是程序运行时的屏幕截图。

图12.9  其他Qt窗口部件

程序清单12.16  其他Qt窗口部件

require 'Qt'

class MyWindow < Qt::Widget
slots 'somethingClicked(QAbstractButton *)'

def initialize(parent = nil)
super(parent)

groupbox = Qt::GroupBox.new("Some Radio Button",self)

radio1 = Qt::RadioButton.new("Radio Button 1", groupbox)
radio2 = Qt::RadioButton.new("Radio Button 2", groupbox)
check1 = Qt::CheckBox.new("Check Box 1", groupbox)

vbox = Qt::VBoxLayout.new
vbox.addWidget(radio1)
vbox.addWidget(radio2)
vbox.addWidget(check1)
groupbox.setLayout(vbox)

bg = Qt::ButtonGroup.new(self)
bg.addButton(radio1)
bg.addButton(radio2)
bg.addButton(check1)

connect(bg, SIGNAL('buttonClicked(QAbstractButton *)'),
self, SLOT('somethingClicked(QAbstractButton *)') )

@label = Qt::Label.new(self)

vbox = Qt::VBoxLayout.new
vbox.addWidget(groupbox)
vbox.addWidget(@label)
setLayout(vbox)
end

def somethingClicked(who)
@label.setText("You clicked on a " + who.className)
end

end

app = Qt::Application.new(ARGV)
widget = MyWindow.new
widget.show
app.exec

在这个新类中,首先创建了一个Qt::GroupBox,这是一个带边框和可选标题的分组框,可以存储其他窗口部件。然后创建两个Qt::RadioButton和一个Qt::CheckBox,并将分组框设置为它们的父窗口部件。

接下来创建了一个Qt::VBoxLayout,用于存储单选按钮和复选框,并将分组框设置为使用这种布局。

接下来很重要的一点是创建一个Qt::ButtonGroup,并将复选框和单选按钮添加到其中。Qt::ButtonGroup用于将按钮、复选框和单选按钮进行逻辑编组,对这些窗口部件的视觉布局没有影响,而是将它们进行逻辑组合以提供互斥等功能(单击某些按钮时取消选择其他一些按钮)。在这个例子中,将按钮组作为buttonClicked信号的源,该信号在组中的按钮被单击时发出。

该信号的发出方式与前面介绍的信号稍有不同,因为它还发出一个参数,这里为用户单击的对象。请注意其中的C++式语法,即使用参数QAbstractButton *。前面说过,Qt是一个C++工具包,因此,有些类型的参数不可避免地使用了C++表示法(但将来的版本可能解决这种问题)。

connect语句最终的结果是,每当按钮被单击时,该按钮都将作为参数传递给somethingClicked插槽。最后,创建了一个Qt::Label和一个Qt::VBoxLayout,并排列所有窗口部件。

在somethingClicked插槽的定义中,每当按钮被单击时都将修改标签的文本,这里显示的是导致信号发出和插槽被调用的对象的类名。

如果使用内置的窗口部件无法满足需求,Qt提供了功能强大的绘图系统供程序员创建自定义窗口部件。程序清单12.17是一个小示例,演示一些这样的特性。

程序清单12.17  自定义的TimerClock窗口部件

require 'Qt'

class TimerClock < Qt::Widget

def initialize(parent = nil)
super(parent)

@timer = Qt::Timer.new(self)
connect(@timer, SIGNAL('timeout()'), self, SLOT('update()'))
@timer.start(25)

setWindowTitle('Stop Watch')
resize(200, 200)
end

def paintEvent(e)
fastHand = Qt::Polygon.new([Qt::Point.new(7, 8),
Qt::Point.new(-7, 8),
Qt::Point.new(0, -80)])

secondHand = Qt::Polygon.new([Qt::Point.new(7, 8),
Qt::Point.new(-7, 8),
Qt::Point.new(0, -65)])
secondColor = Qt::Color.new(100, 0, 100)
fastColor = Qt::Color.new(0, 150, 150, 150)

side = [width, height].min
time = Qt::Time.currentTime

painter = Qt::Painter.new(self)
painter.renderHint = Qt::Painter::Antialiasing
painter.translate(width() / 2, height() / 2)
painter.scale(side / 200.0, side / 200.0)

painter.pen = Qt::NoPen
painter.brush = Qt::Brush.new(secondColor)

painter.save
painter.rotate(6.0 * time.second)
painter.drawConvexPolygon(secondHand)
painter.restore

painter.pen = secondColor
(0...12).each do |i|
painter.drawLine(88, 0, 96, 0)
painter.rotate(30.0)
end

painter.pen = Qt::NoPen
painter.brush = Qt::Brush.new(fastColor)

painter.save
painter.rotate(36.0 * (time.msec / 100.0) )
painter.drawConvexPolygon(fastHand)
painter.restore

painter.pen = fastColor
(0...60).each do |j|
if (j % 5) != 0
painter.drawLine(92, 0, 96, 0)
end
painter.rotate(6.0)
end

painter.end
end
end

app = Qt::Application.new(ARGV)
wid = TimerClock.new
wid.show
app.exec


在这个例子中,也创建了一个自定义的窗口部件,这次名为TimerClock。在其初始化方法中,创建了Qt::Timer的一个实例,可以将其设置为定期地发出信号。这里将其timeout信号同TimerClock的update插槽管理起来。update插槽是内置的,导致窗口部件重绘。

通过调用start方法启动定时器,其参数指定每隔25毫秒就超时(并发出timeout信号),这意味着窗口部件的update插槽将每25毫秒执行一次。

接下来创建了paintEvent方法,它重写了Qt::Widget提供的同名方法。当窗口部件需要重绘时(这里是每当Qt::Timer过期时)将调用该方法。通过重写这个方法,可以定制窗口部件如何在屏幕上绘制自己。在这个方法中,代码负责处理窗口部件的原始绘画例程。

从现在开始,就全部是几何学的内容了。创建几个Qt::Polygon来表示要绘制的时钟的指针。注意,多边形的方向无关紧要,因为以后可以修改。

接下来设置要用到的一些属性。为时钟指针定义了两个Qt::Color。Qt::Color的初始化方法的参数是RGB值和可选的alpha透明度值。

由于要绘制的定时器放在正方形中,但窗口可能是矩形,这可能导致窗口部件的形状很怪异。这里使用side变量来存储窗口部件显示在屏幕上时较短一边。另外,还使用Qt::Time.currentTime来存储当前时间。

接下来,创建一个Qt::Painter,并使用它来开始执行绘图例程。绘画时使用消除锯齿功能使边缘看起来光滑些,还通过调用painter.translate(width/2, height/2)将Qt::Painter的起始坐标设置为绘图区域的中央。同时将Qt::Painter缩放为200:200引用范围,这意味着所有绘图命令都将在200:200单位内进行绘画。如果绘画区域变大或变小,将自动调整每个单位的长度。

接下来执行一系列绘图操作,在执行变换(如旋转)时,这些操作将放在painter.save和painter.restore之间。save将当前的painter属性存储在栈中,以方便恢复它们。

代码将时钟指针旋转到表示正确时间的角度,然后绘制它们;并沿钟面的外边缘以特定的间隔绘制一些刻度。

最后通知绘图器结束绘图(通过调用painter.end)。最后使用4行代码创建Qt::Application和定时器窗口部件,再开始事件循环。图12.10显示了最终的结果。

 
图12.10  TimerClock窗口部件

【责任编辑:雪花 TEL:(010)68476606-8007】

回书目   上一节   下一节
专题
Ruby实用开发手册
Java编程开发手册
Ajax+JSP网站开发从入门到精通
ASP.NET Ajax网站开发从入门到精通
非常网管——网络管理从入门到精通
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
浏览器的战国时代
浏览器的战国时代
ARP攻击防范与解决方案
ARP攻击防范与解决方案
NAC安全访问控制
NAC安全访问控制
· NAC安全访问控制
· 网络布线测试仪器
· Windows Server 2008专..
· Windows远程桌面应用
· 网络故障排除宝典
· 运营商封堵ADSL共享 中..
· 解析35岁技术人的价值..
· 世纪枭雄比尔盖茨的王..
· 主流品牌防火墙配置
· ASP.NET开发教程
· 超级计算机TOP500专题
· Vista SP1对决XP SP3
· SQL Server 2008/2005..
· 程序员如何成长?
· C#技术开发指南
· 虚拟化技术还有点“虚”
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SOA 面向服务架构
SOA 面向服务架构
· SOA 面向服务架构
· SQL Server 2008/2005..
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· Windows远程桌面应用
· C#技术开发指南
· Apache技术专题
· Windows集群服务应用
· C#技术开发指南
· 国际文档格式标准开战
· 路由器设置与口令恢复
· Linux 集群技术专题
· PHP开发应用手册
· SOA 面向服务架构
· 企业数据恢复指南
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SQL Server入门到精通
SQL Server入门到精通
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· C#技术开发指南
· 三层交换技术专题
· Apache技术专题
· C#技术开发指南
· Windows远程桌面应用
· 企业数据恢复指南
· Windows集群服务应用
· 路由器设置与口令恢复
· Linux 集群技术专题
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· 反垃圾邮件技术应用