详解 QT 主要类 QWidget

移动开发
QWidget类是所有用户界面对象的基类,每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。 先来看内容。

QT 主要类 QWidget 是本文介绍的内容,QWidget类是所有用户界面对象的基窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己的表现。每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。

每一个窗口部件构造函数接受两个或三个标准参数:

QWidget *parent = 0是新窗口部件的父窗口部件。如果为0(默认),新的窗口部件将是一个***窗口部件。如果不是,它将会使parent的一个孩子,并且被parent的几何形状所强迫(除非你指定WType_TopLevel作为窗口部件标记)。
const char *name = 0是新窗口部件的窗口部件名称。你可以使用name()来访问它。窗口部件名称很少被程序员用到,但是对于图形用户界面构造程序,比如Qt设计器,是相当重要的(你可以在Qt设计器中命名一个窗口部件,并且在你的代码中使用这个名字来连接它)。dumpObjectTree()调试函数也使用它。
WFlags f = 0(在可用的情况下)设置窗口部件标记,默认设置对于几乎所有窗口部件都是适用的,但是,举例来说,一个没有窗口系统框架的***窗口部件,你必须使用特定的标记。

你自己将需要为你的窗口部件提供内容,但是这里是一些简要的运行事件,从最普通的开始:

paintEvent() - 只要窗口部件需要被重绘就被调用。每个要显示输出的窗口部件必须实现它并且不在paintEvent()之外在屏幕上绘制是明智的。

resizeEvent() - 当窗口部件被重新定义大小时被调用。

mousePressEvent() - 当鼠标键被按下时被调用。有六个鼠标相关事件,但是鼠标按下和鼠标释放事件是到目前为止最重要的。当鼠标在窗口部件内或者当它使用grabMouse()来捕获鼠标时,它接收鼠标按下事件。

mouseReleaseEvent() - 当鼠标键被释放时被调用。当窗口部件已经接收相应的鼠标按下事件时,它接收鼠标释放事件。这也就是说如果用户在你的窗口部件内按下鼠标,然后拖着鼠标到其它某个地方,然后释放,你的窗口部件接收这个释放事件。这里有一个例外:如果出现在弹出菜单中,当鼠标键被按下时,这个弹出菜单立即会偷掉这个鼠标事件。

mouseDoubleClickEvent() - 和它看起来也许不太一样。如果用户双击,窗口部件接收一个鼠标按下事件(如果他们没有拿牢鼠标,也许会出现一个或两个鼠标移动事件)、一个鼠标释放事件并且最终是这个事件。直到你看到第二次点击是否到来之前,不能从一个双击中辨别一个点击。(这是为什么绝大多数图形用户界面图书建议双击是单击的一个扩展,而不是一个不同行为的触发的一个原因。)

如果你的窗口部件仅仅包含子窗口部件,你也许不需要实现任何一个事件处理器。如果你想检测在子窗口部件中的鼠标点击,请在父窗口部件的mousePressEvent()中调用子窗口部件的hasMouse()函数。

接收键盘的窗口部件需要重新实现一些更多的事件处理器:(详见http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html#details )

QTime类提供了时钟时间功能。

QTime对象包含时钟时间,比如从午夜开始的时、分、秒和毫秒数。它可以从系统时钟中读取当前的时间并且度量时间的跨度。它提供比较时间和操作时间的函数,比如加上一定的秒或毫秒。

QTime操作的是24小时时钟格式,它没有AM/PM概念。它操作的是本地时间,它不知道有关时区或白天时间的概念。

QTime对象通常可以由明白地给定的时、分、秒和毫秒数字来创建,或者使用静态函数currentTime()让QTime对象包含系统时钟时间。注意精确性取决于下面操作系统的精确性,不是所有的操作系统都有毫秒级精确度的。

hour()、minute()、second()和msec()函数提供了对时、分、秒和毫秒数字的访问。toString()提供了文本格式的相同信息。

一个给定时间之后给定的秒或毫秒数的时间可以使用addSecs()或addMSecs()得到。相对地,两个时间的秒(或毫秒)数可以使用secsTo()或msecsTo()得到。

QTime可以使用start()、restart()和elapsed()函数度量流逝的时间。

  1. QTime QTime::currentTime () [静态]  

返回当前时间,来自于系统时钟。

QTimer类提供了定时器信号和单触发定时器。

它在内部使用定时器事件来提供更通用的定时器。QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

注意当QTimer的父对象被销毁时,它也会被自动销毁。

实例:

  1. QTimer *timer = new QTimer( myObject );          
  2. connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );          
  3. timer->start( 2000, TRUE ); // 2秒单触发定时器   

你也可以使用静态的singleShot()函数来创建单触发定时器。

作为一个特殊情况,一旦窗口系统事件队列中的所有事件都已经被处理完,一个定时为0的QTimer就会到时间了。

这也可以用来当提供迅速的用户界面时来做比较繁重的工作。

  1. QTimer *t = new QTimer( myObject );          
  2. connect( t, SIGNAL(timeout()), SLOT(processOneThing()) );          
  3. t->start( 0, FALSE );      
  4. myObject->processOneThing() 

将会被重复调用并且应该很快返回(通常在处理一个数据项之后),这样Qt可以把事件传送给窗口部件并且一旦它完成这个工作就停止这个定时器。这是在图形用户界面应用程序中实现繁重的工作的一个典型方法,现在多线程可以在越来越多的平台上使用,并且我们希望无效事件最终被线程替代。

注意QTimer的精确度依赖于底下的操作系统和硬件。绝大多数平台支持20毫秒的精确度,一些平台可以提供更高的。如果Qt不能传送定时器触发所要求的数量,它将会默默地抛弃一些。

另一个使用QTimer的方法是为你的对象调用QObject::startTimer()和在你的类中(当然必须继承QObject)重新实现QObject::timerEvent()事件处理器。缺点是timerEvent()不支持像单触发定时器或信号那样的高级水平。

一些操作系统限制可能用到的定时器的数量,Qt会尽力在限制范围内工作。

QButton类是按钮窗口部件的抽象基类,提供了按钮所共有的功能。

如果你想创建一个按钮,请使用QPushButton。 http://www.qtopia.org.cn/doc/qiliang.net/qt/qbutton.html

QButton类实现了一个抽象按钮,并且让它的子类来指定如何回复用户的行为和如何画按钮。

QButton提供了推动和切换按钮。QRadioButton和QCheckBox类只提供了切换按钮,QPushButton和QToolButton提供了切换按钮和推动按钮。

任何按钮都可以有一个文本的或者像素映射的标签。setText()设置按钮为一个文本按钮并且setPixmap()设置它为一个像素映射按钮。文本/像素映射的使用中需要创建当按钮被取消使用时所需的“失效的”外观。

QButton提供了按钮所要用到的绝大多数状态:

isDown()决定按钮是否被按下。

isOn()决定按钮是否是开的。只有切换按钮才能被切换为开或关(请看下面)。
isEnabled()决定按钮是否可以被用户按下。

setAutoRepeat()决定如果用户按下按钮,按钮是否可以自动回复。

setToggleButton()决定按钮是否是一个切换按钮。

isDown()和isOn()的不同点如下:当用户点击一个切换按钮并且把它切换为开,按钮首先被按下并且然后被释放变为开状态。当用户再次点击(切换为关),按钮首先移动到被按下状态,然后变为关状态(isOn()和isDown()都为假)。

默认按钮(在很多对话框中被使用的)由QPushButton::setDefault()和QPushButton::setAutoDefault()提供。

QButton提供五个信号:

当鼠标光标在按钮内,鼠标左键被按下时,pressed()被发送。

当鼠标左键被释放时,released()被发送。

当按钮首先被按下然后又被释放或者快捷键被按下,或者当animateClick()被调用时,clicked()被发送。

当切换按钮的状态变化时,toggled(bool)被发送。

当一个三态切换按钮的状态变化时,stateChanged(int)被发送。

如果一个文本按钮的文本中有“&”,QButton会创建一个自动快捷键。下面的代码创建一个标签为“Rock & Roll”(c下面有下划线)的推动按钮。这个按钮有一个自动快捷键,Alt+C:

QPushButton *p = new QPushButton( "Ro&ck && Roll", this );  在这个实例中,当用户按下Alt+C时,按钮将会调用animateClick()。

你也可以使用setAccel()函数来设置一个定制的快捷键。这个对于绝大多数像素映射按钮是很有用的,因为它们没有自动快捷键。

QPushButton *p;    p->setPixmap( QPixmap("print.png") );    p->setAccel( ALT+Key_F7 );  Qt所提供的所有按钮(QPushButton、QToolButton、QCheckBox和QRadioButton)都能够既显示文本也显示像素映射。

为了继承QButton,你至少不得不重新实现drawButton()(绘制按钮的外形)和drawButtonLabel()(绘制它的文本或像素映射)。通常也被建议重新实现sizeHint(),并且有时也被建议重新实现hitButton()(为了决定一个按钮按下是否在按钮内)。

为了减少闪烁,QButton::paintEvent()设置drawButton()中所要画的一个像素映射。你不用在QButton的子类中重新实现paintEvent(),除非你想接管全部的绘制工作。

小结:关于详解 QT 主要类 QWidget 的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: CSDN博客
相关推荐

2011-06-16 11:13:13

QtQWidget

2011-06-28 11:05:19

Qt QWidget Eventable

2011-06-24 15:06:40

QT

2011-06-24 14:17:58

Qt 容器类 QVector

2011-03-18 19:37:38

Eventable接口QtWidget

2011-06-16 11:28:48

Qt QApplicati

2011-06-15 17:28:23

Qt 多视图 架构

2011-06-24 10:05:51

QT 对象 父对象

2011-06-28 15:01:01

Qt PIMPL

2011-06-20 17:33:58

Qt MeegoTouch Maemo

2011-06-21 18:02:14

Qt 动态 链接库

2011-06-14 15:45:02

Qt Object

2011-06-23 14:05:32

Qt 事件机制

2011-08-16 19:27:53

ORACLE GOLD

2011-06-24 15:30:22

QT 皮肤 QSS

2011-06-17 09:58:26

Qt Chapter QObject

2011-06-24 10:54:34

Qt Mysql

2011-06-17 10:19:11

Qt QWidge QSetting

2011-06-24 12:58:49

Qt LineEdit

2011-07-04 17:18:23

Qt SQLite 数据库
点赞
收藏

51CTO技术栈公众号