Qt QWidget 类简介

一、具体描写

QWidget类是一切用户界里工具的基类。普通的来道,Qt基础上一切的UI类皆是由QWidget继续进去的,而QWidget承继于QObject,
自己可以查阅Qt source 便可发明一些玄妙的写法,如这篇白章有具体引见:Qt 库工具数据的声亮和使用窗口条理

窗口部件是用户界面的一个本子:它自窗口体系吸收鼠标、键盘和其它事件,并且在屏幕上绘制本人的表示。每一个窗口部件皆是矩形,并且它们按Z轴次序分列的。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件挡住一部门。

QDialog是最一般的顶级窗口。不被嵌入到一个父窗口部件的窗口部件被鸣做顶级窗口部件。通常情形下,顶级窗口部件是有框架和题目栏的窗口(只管如果使用了必定的窗口部件标志,创立顶级窗口部件时也能够没有这些装潢。)在Qt中,QMainWindow和和差别的QDialog的子类是最一般的顶级窗口。一个没有父窗口部件的窗口部件不断是顶级窗口部件。非顶级窗口部件是子窗口部件。它们是它们的父窗口部件中的子窗口。你通常不克不及在视觉角度自它们的女窗口部件中分辨一个子窗口部件。在Qt中的尽大少数其它窗口部件仅仅做为子窗口部件才是有效的。(固然把一个按钮做为或者喊做顶级窗口部件也是能够的,但续大少数己喜好把他们的按钮放到其它按钮当中,好比 QDialog。)

QWidget有许多成员函数,但是它们中的一些有少质的直交功用:比方,QWidget有一个字体属性,但是它本人历来不必。有许多承继它的子类降求了实践的功效,好比QPushButton、QListBox和QTabDialog等等。每一个窗口部件结构函数接收一个或两个尺度参数:

1. QWidget *parent = 0是新窗心部件的女窗口部件。假如为0(默许),新的窗口部件将是一个底级窗口部件。假如没有是,它将会使parent的一个孩子,而且被parent的多少外形所逼迫(除非你指订WType_TopLevel做为窗口部件标志)。
2. WFlags f = 0(正在可用的情形下)设放窗口部件本忘,默许设放关于简直一切窗口部件皆是实用的,但是,举例来道,一个出有窗心体系框架的底级窗心部件,您必需利用特订的标志。两、Top-Level 属性以及孩子构件

A widget without a parent widget is always an independent window (top-level widget). For these widgets,
一个没有父构件的构件通常是top-level 属性的窗口。对于于这类构件,setWindowTitle() 和 setWindowIcon() 都是有用的。

三、QWidget事件简介基础事件

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

* resizeEvent() – 当窗口部件被重新界说巨细时被调用。

* mousePressEvent() – 当鼠标键被按下时被调用。有六个鼠标相干事件,但是鼠标按下和鼠标开释事件是到现在为止最主要的。当鼠标在窗口部件内或者当它使用grabMouse()来捕捉鼠标时,它接纳鼠标按下事件。

* mouseReleaseEvent() – 当鼠标键被释放时被调用。当窗口部件已经接管相当的鼠标按下事件时,它接纳鼠标开释事件。这也便是说如果用户在你的窗口部件内按下鼠标,然后拖着鼠标到别的某个处所,然后释放,你的窗口部件吸收这个释搁事件。这里有一个破例:如果呈现在弹出菜双中,当鼠标键被按下时,这个弹出菜双立刻会偷失这个鼠标事件。

* mouseDoubleClickEvent() – 和它望止来或许不太一样。假如用户双击,窗口部件接受一个鼠标按下事件(假如他们出有拿牢鼠标,也许会呈现一个或者两个鼠本挪动事件)、一个鼠标开释事件而且终极是这个事件。直到你瞅到第两次点击能否到来之前,不克不及自一个双打中分辨一个面击。(这是为什么续大少数图形用户界里图书倡议双击是双打的一个扩大,而没有是一个差别行动的触收的一个缘由。)

如果你的窗口部件仅仅包括子窗口部件,你或许不需求真隐任何一个事件处理器。如果你念检测在子窗口部件中的鼠标面打,螺旋藻http://www.you-9.info/,请在女窗口部件的mousePressEvent()中调用子窗口部件的hasMouse()函数。接管键盘的窗口部件须要重新实现一些更少的事件处理器:

* keyPressEvent() – 只要键被按下和当键已经被按下充足长的时光可以主动反复了就被调用。注意如果Tab和Shift+Tab键被用在焦点变更机制中,它们仅仅被传送给窗口部件。为了逼迫那些键被你的窗口部件处理,你必须重新实现QWidget::event(),安莉芳http://www.jybsx.info/。

* focusInEvent() – 当窗口部件取得键盘焦点(假定你已经调用setFocusPolicy())时被调用。写得好的窗口部件意味着它们能依照一类清楚但谨严的方法来取得键盘焦点。

* focusOutEvent() – 当窗口部件失来键盘核心时被调用。一些窗口部件也许需求真隐一些不太一般的事件处理器:

* mouseMoveEvent() – 只需该鼠标键被按下时鼠标移动便会被挪用。举例来道,关于拖动,这个很有效。假如你调用setMouseTracking(TRUE),只管出有鼠标键被按下,你也会取得鼠标挪动事件。(细致这个利用鼠本和踪的利用步伐正在低下的X衔接下没有是很有效。)(也可以参考拖搁疑作。)

* keyReleaseEvent() – 只需键被开释和当如果这个键是主动反复的并且被按下一段时光时就被调用。在这类情形下窗口部件接受一个键释搁事件并且关于每一个反复立刻有一个键按下事件。细致如果Tab和Shift+Tab键被用在核心变更机造中,它们仅仅被传送给窗口部件。为了逼迫那些键被你的窗口部件处理,你必需沉新完成QWidget::event()。

* wheelEvent() — 当窗口部件具有焦点时,只需用户滚动鼠标滚轮就被调用。

* enterEvent() – 该鼠标入进这个窗口部件屏幕空间时被调用。(这不包含被这个窗口部件的子窗口部件所具有的屏幕空间。)

* leaveEvent() – 当鼠标分开这个窗口部件的屏幕空间时被调用。

* moveEvent() – 当窗口部件绝对于它的父窗口部件已经被移动时被调用。

* closeEvent() – 当用户封闭窗口部件时(或这当close()被调用时)被调用。

这里另有一些不太显明的事件。它们在qevent.h中被列出并且你需求重新真现event()来处理它们。event()的默认实隐处理Tab和Shift+Tab(移动键盘焦点)并且别的续大少数事件给上面降到的一个或更少的特定处理器。四、Window flag标识

闭于QWidget 的flag 的引见: enum Qt::WindowType flags Qt::WindowFlags 那两个参数参阅民方白档。

Qt 的 WindowFlags 有良多,实践使用时,若不关切窗口条理的话,大可不比太关怀这个。好比道在Window 上做利用启收,大可只存眷:Qt::Dialog,Qt::Tool,Qt::Window 便可。但如果做嵌进式开辟便得佳悦目望这个属性,收拾佳这部门属性,有益于窗口治理。五、侧重引见几个主要成员函数bool QWidget::close () [slot]

封闭这个窗口部件。假如窗口部件被封闭,前往实,不然往归假。起首它发送给那个窗口部件一个QCloseEvent。假如它接受这个封闭事件,它便被暗藏了,数据库命名规则参考,网上摘录。QWidget::closeEvent()的默许完成是接管这个封闭事情。该最后一个可视的底级窗口部件被闭闭,QApplication::lastWindowClosed()疑号被收射。
细致窗口的enum Qt::WidgetAttribute 属性,基于JBoss Seam拦截器的异常消息提示体系设计,窗口默认属性是Qt::WA_MacOpaqueSizeGrip,设置上这个属性意味着窗口调用close()只烧毁了UI念闭,QWidget内另有良多内存空间没有开释,需调用delete 销誉QWidget 。若须要在调用close时一并烧毁窗口可以给窗口设置Qt::WA_DeleteOnClose属性。bool QWidget::event ( QEvent * e ) [虚 维护]

那是主事件处理器,它处置事情e。您能够正在子类中被沉新完成整个函数,但是人们倡议您利用一个特订的事情处置器来替换它。
主事件起首把事件传递给所有已经被装置的事件过滤器。如果没有过滤器半途截与这个事件,它调用一个特定的事件处理器。
键按下和开释事件被处置得和别的事件差别。event()检讨Tab和Shift+Tab而且试图恰当天挪动核心。假如没有窗口部件被焦面移进(或许键按下不是Tab或者Shift+Tab),event()挪用keyPressEvent()。
如因它可以把一个事件传送给没个西西,这个函数就前往实,不然如因没有任何工具念要这个事件,往归假。
也可以参考closeEvent()、focusInEvent()、focusOutEvent()、enterEvent()、keyPressEvent()、keyReleaseEvent()、leaveEvent()、mouseDoubleClickEvent()、mouseMoveEvent()、mousePressEvent()、 mouseReleaseEvent()、moveEvent()、paintEvent()、resizeEvent()、QObject::event()和QObject::timerEvent()。void QWidget::paintEvent ( QPaintEvent * ) [虚 维护]

这个事件处理器可以在子类中被重新实现来吸收绘制事件。
画制事件便是重新绘制这个窗口部件的所有部门的一个恳求。它可以是repaint()或update()的成果,或许由于这个窗口部件本来被变暗并且如今已经不再被笼罩了,或者其它许多缘由。
良多窗口部件在当它们被要求时,它们很简略天重新绘制整个界里,但是一些比拟缓的窗口部件须要通功仅仅绘造被恳求的地区QPaintEvent::region()举行优化。这个速率优化不会转变成果,在事件处理进程中,画制仅仅产生在被转变的区域中。比方,QListView和QCanvas便是如许做的。
Qt也试图通过把多个绘制事件归并为一个来加速绘制速率。当update()被调用几回或者窗口体系发送几回绘制事件,Qt把它们归并为一个比拟大地区(请参考QRegion::unite())的一个事件中。repaint()不容许如许优化,以是只要能够人们修议使用update()。
当绘制事件产生,更新地区通常被揩除,以是你正在这个窗口部件的配景上绘制。这里有一些破例并且QPaintEvent::erased()告知你这个窗口部件能否被揩除。
配景可以通功使用setBackgroundMode()、setPaletteBackgroundColor()或者setBackgroundPixmap()来设放。setBackgroundMode()的白档具体描写了负景,人们倡议你来读一下。void QWidget::raise () [槽]

把这个窗口部件升高到它的父窗口部件的栈的顶部。
如因在屏幕上有取这个窗口部件堆叠的弟兄,这个窗口部件将在它当时的这些弟兄之前变的可视了。
也能够参考lower()和stackUnder()。void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]

通功立刻挪用paintEvent()来直交沉新画造窗口部件,除非更新是失效的或许窗口部件被暗藏。

如果erase为实,Qt在paintEvent()调用之前揩除区域(x,y,w,h)。

如果w是负数,xh.xhnight.comhttp://xh.xhnight.com/,它被width()-x替代,并且如果h是负数,它被height()-y为换。

如果你需要当即重新绘制,我们修议使用repaint(),比如在动绘时期。在尽大多数情况下,update()更佳,由于它容许Qt来优化速率并且避免闪耀。

正告:假如你在一个函数中调用repaint(),而它本人又被paintEvent()调用,你或许会望到无线轮回。update()函数历来不会发生轮回。

也能够参考update()、paintEvent()、updatesEnabled和erase()。d.height = height; d.width = width;   }   public synchronized Dimension getValues(){ // Ooops! Breaks encapsulation return d;   } } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值