StupidBeauty
Read times:3661Posted at: - no title specified

Qt5.6文档翻译:QWidget,QWidget Class

详细说明

QWidget类是所有用户界面对象的基类。

部件是用户界面的原子成分:它从窗口系统接收鼠标、键盘和其它事件,并在屏幕上绘制一些图形来表自己。每个部件都是矩形,并且是按照Z顺序排序的。部件的外观会被它的亲代部件和位于它前面的部件所裁剪。

没有嵌入到亲代部件中的部件被称作窗口。通常,窗口拥有边框和标题栏,当然,也可以使用适当的窗口标志来创建没有这种窗口装饰的窗口。在Qt中,QMainWindowQDialog的那些子类是最常用的窗口类型。

每个部件的构造函数接受一到两个标准参数:

  1. 1.QWidget *parent = 0是这个新部件的亲代部件。如果它是0(默认情况),那么这个新的部件将会成为一个窗口。如果不是0的话,它会成为parent的一个子代部件,并且会被parent的几何属性所约束(除非你指定Qt::Window作为窗口标志)。

  2. 2.Qt::WindowFlags f = 0(在可用的情况下)设置窗口的标志;默认的选项适用于几乎所有的部件,但是要弄出特殊窗口,比如说没有窗口框的窗口你必须使用特殊的标志。

QWidget拥有很多成员函数,但是其中的一些函数没有直接功能;例 如,QWidget拥有一个font 属性,但是它自己从来不使用这个属性。有很多子类提供实际的功能,例如QLabelQPushButtonQListWidgetQTabWidget

顶级部件和子代部件

一个没有亲代部件的部件是一个独立的窗口(顶级部件)。对于这些部件,setWindowTitle()和setWindowIcon()分别设置它们的标题栏和图标。

非窗口的部件就是子代部件,它们被显示在它们的亲代部件里面。Qt 中的大部分部件都适合于用作子代部件。例如,可以将一个按钮显示成一个顶级窗口,但是大部分人都选择将他/她们的按钮放到其它部件里面去,比如说QDialog

上面的图片显示的是一个用来存放多个子代部件的QGroupBox部件,它将这些子代部件放在一个由QGridLayout提供的布局里面。那几个QLabel子代部件的边框都画出来咯,这样就能显示出它们的整个大小咯。

如果你想使用QWidget 来存放子代部件,那么你通常需要向这个亲代的QWidget 添加一个布局管理器。阅读布局管理以了解更多信息。

组合部件

当一个部件被当作一个容器来将子代部件组合在一起时,它就被称作一个组合部件。可以这样来创建这种东西:构造一个有着需要的视觉属性的部件——例如一个QFrame——再将由一个布局对象管理的子代部件添加到其中。上面的图片显示的就是一个用Qt设计师创建的组合部件。

组合部件也可以通过以下方式创建:子类化一个标准的部件, 例如QWidget或者QFrame,再在子类的构造函数里面添加必要的布局和子代部件。Qt 提供的例子中有很多是采用咯这个方法的,而且在Qt教程里面也有例子。

自定义的部件及其绘制

由于QWidget 是QPaintDevice的一个子类,所以可以使用子类来显示自定义的内容:使用QPainter类的一个实例来做出一系列的绘图操作。这种方式与图形视图框架使用的画布方式相反, 在那种方式下一个个的项目是由程序添加到场景并且由框架自己渲染出来的。

每个部件都是在它的paintEvent()函数里面进行全部的绘图操作的。无论是由于内部发生变化还是被程序要求的,每当这个部件需要重绘的时候这个函数就会被调用。

模拟时钟示例展示咯一个简单的部件是如何处理绘图事件的。

大小提示和大小策略

在实现一个新的部件时,这样做几乎总是有用的:覆盖sizeHint()来为部件提供一个合理的默认大小;并且使用setSizePolicy()来设置正确的大小策略。

默认地,没有提供大小提示的组合部件会被按照它们的子代部件的空间需求来确定大小。

大小策略让你为布局管理系统提供好的默认行为,这样其它的部件就可以轻松地包含并且管理你的部件。默认的大小策略就是,它的大小提示就表咯它自己的首选大小,而且这通常对于很多部件来说已经足够咯。

注意:顶级部件的大小被约束在桌面的宽度和高度的2/3。如果这些限制是不准确的,那么你可以手动地对这个部件执行resize()以调整大小。

事件

部件对事件作出响应,而事件一般是由用户操作引起的。Qt通过调用特定的事件处理函数并且以包含每个事件的信息的QEvent子类的实例作为参数来向部件传递事件。

如果你的部件只包含子代部件,那么你可能不需要实现任何事件处理函数。如果你想要探测在某个子代部件中的鼠标点击,那么就在这个部件的mousePressEvent()函数中调用那个子代部件的underMouse() 函数。

涂鸦S cribble )示例实现咯更多用来处理鼠标移动、按钮按下和窗口大小改变的事件函数。

你需要为你自己的部件提供行为和内容,但是这里的是与QWidget 相关的事件的一个概述,从最常见的开始:

  • •.•.paintEvent(),每当部件需要被重绘的时候就会被调用。每个显示自定义内容的部件都必须实现它。使用QPainter所进行的绘图操作只能在paintEvent()或者被paintEvent()调用的函数中完成。

  • •.•.resizeEvent(),每当这个部件被改变大小时,就会被调用。

  • •.•.mousePressEvent(),在以下条件下,鼠标被按下时被调用:鼠标指针在这个部件里面,或者这个部件已经使用grabMouse()抓取咯鼠标。按下鼠标却不放开它,这样做的效果与调用grabMouse()是一样的。

  • •.•.mouseReleaseEvent(),当鼠标按钮被释放时被调用。如果一个部件已经接收到咯对应鼠标按下事件,那么它会接收鼠标释放事件。这就是说,如果用户在你的部件里面按下鼠标,然后在释放鼠标之前将鼠标拖到别的地方,那么将会是 你的部件接收到释放事件。只有一个例外:如果在鼠标按住的时候,有一个弹出菜单出现,那么这个弹出菜单马上窃取鼠标事件。

  • •.•.mouseDoubleClickEvent(),当用户在部件里面双击鼠标时被调用。如果用户双击,这个部件接收到一个鼠标按下事件、一个鼠标释放事件(组成一个鼠标点击事件),然后是第二个鼠标按下事件,接下来是本事件,并最后接收到第二个鼠标松开事件。(如果在双击过程中用户没有抓牢鼠标,那么也会接收到一些鼠标移动事件。)除非发生咯第二次点击,否则不可能将一个单击与一个双击区分开。(这就是为什么某些图形用户界面书籍建议将双击作为单击的扩展,而不是触发一个不同动作的一个原因。)

接收键盘输入的部件需要覆盖另外的一些事件处理函数:

  • •.•.keyPressEvent(),当一个按键被按下的时候调用,并且如果这个按键被按住足够长达到让它自动重复的时间,那么会再次调用这个事件处理函数。Tab和Shift+Tab这两个按键只有在不被用于改变焦点的机制时才会被传递给部件。要强制让这些按键被你的部件处理,你就必须覆盖QWidget::event()。

  • •.•.focusInEvent(),当这个部件获得咯键盘焦点时被调用(假设你已经调用咯setFocusPolicy())。行为良好的部件会以一种清晰而又周到的方式来提示它们拥有键盘焦点。

  • •.•.focusOutEvent(),当这个部件失去键盘焦点的时候被调用。

你可能还需要覆盖以下的一些不那么常用的事件处理函数:

  • •.•.mouseMoveEvent(),在个鼠标按钮被按下的情况下,每当鼠标移动咯就会调用这个事件处理函数。这在拖放操作中会很有用。如果你调用 setMouseTracking(true),那么你甚至能在没有鼠标按钮被按下的情况下获取鼠标移动事件。(参 拖放向导。)

  • •.•.keyReleaseEvent(),当某个键盘按键被松开或者被长期按住(如果该按键触发了自动重复)的时候,便会调用此函数。在这种情况下,对于每次重复,本部件都会收到一对按键松开和按键按下事件。Tab和Shift+Tab按键,只有在它们不被作为焦点变更机制使用时才会传递给本部件。要想强制让那些按键被妳的部件处理的话,妳必须重写QWidget::event()。

  • •.•.wheelEvent() ,当用户在本部件拥有焦点的情况下滚动鼠标滚轮的时候,便会调用此函数。

  • •.•.enterEvent() ,当鼠标光标进入本部件的屏幕区域时,便会调用此函数。 (这不包括由本部件的任何子代部件拥有的屏幕区域。)

  • •.•.leaveEvent() ,当鼠标光标离开本部件的屏幕区域时,便会调用此函数。如果鼠标进入了一个子代部件的话,不会触发leaveEvent()事件。

  • •.•.moveEvent() ,当本部件被相对于其亲代部件移动位置时,便会调用此函数。

  • •.•.closeEvent() ,当用户关闭本部件(或者close()被调用)时,会调用此函数。

QEvent::Type文档中还描述了一些非常罕见的事件。要想处理那些事件的话,妳需要直接覆盖event()。

event()的默认实现中,会处理Tab和Shift+Tab (用来移动键盘焦点),并且将大部分其它事件都传递给以上所说的某个特定的事件处理函数。

事件及用来传递事件的机制,在事件系统中有说明。

函数和属性分组

上下文

函数和属性

窗口函数

show(), hide(), raise(), lower(), close().

顶级窗口

windowModified, windowTitle, windowIcon, isActiveWindow, activateWindow(), minimized, showMinimized(), maximized, showMaximized(), fullScreen, showFullScreen(),showNormal().

窗口内容

update(), repaint(), scroll().

几何属性

pos, x(), y(), rect, size, width(), height(), move(), resize(), sizePolicy, sizeHint(), minimumSizeHint(), updateGeometry(), layout(), frameGeometry, geometry, childrenRect,childrenRegion, adjustSize(), mapFromGlobal(), mapToGlobal(), mapFromParent(), mapToParent(), maximumSize, minimumSize, sizeIncrement, baseSize, setFixedSize()

模式

visible, isVisibleTo(), enabled, isEnabledTo(), modal, isWindow(), mouseTracking, updatesEnabled, visibleRegion().

观感

style(), setStyle(), styleSheet, cursor, font, palette, backgroundRole(), setBackgroundRole(), fontInfo(), fontMetrics().

键盘焦点函数

focus, focusPolicy, setFocus(), clearFocus(), setTabOrder(), setFocusProxy(), focusNextChild(), focusPreviousChild().

鼠标及键盘抓取

grabMouse(), releaseMouse(), grabKeyboard(), releaseKeyboard(), mouseGrabber(), keyboardGrabber().

事件处理函数

event(), mousePressEvent(), mouseReleaseEvent(), mouseDoubleClickEvent(), mouseMoveEvent(), keyPressEvent(), keyReleaseEvent(), focusInEvent(), focusOutEvent(), wheelEvent(),enterEvent(), leaveEvent(), paintEvent(), moveEvent(), resizeEvent(), closeEvent(), dragEnterEvent(), dragMoveEvent(), dragLeaveEvent(), dropEvent(), childEvent(), showEvent(),hideEvent(), customEvent(). changeEvent(),

系统函数

parentWidget(), window(), setParent(), winId(), find(), metric().

交互式帮助

setToolTip(), setWhatsThis()

部件样式单

除了每个平台提供的标准部件样式之外,还可以根据样式单中指定的规则来改变部件的样式。这个特性,使得妳可以对特定部件的外观进行自定义,以向用户提供可视化的提示。例如,对于某个按钮,可将它设置成特定的外观,以表明该按钮会产生破坏性的效果。

Qt样式单文档中,对于部件的样式单的使用有详细的说明。

透明及双缓冲

从Qt 4.0开始,QWidget会自动对绘图操作进行双缓冲,所以,不需要在paintEvent()中编写双缓冲代码以避免闪烁了。

从Qt 4.1开始,Qt::WA_ContentsPropagated这个部件属性已经被废弃了。新的行为是,只要Qt::WA_PaintOnScreen未设置,则,亲代部件的内容默认会传递给每个子代部件。自定义的部件代码中可利用此特性,具体做法是:更新不规则的区域(用来创建非矩形的子代部件);或者使用半透明的颜色来绘制图形。以下图片,展示了,在对一个自定义部件的属性进行微调的情况下,可以达到何种不同的效果。

在上图中,构造了一个半透明并且挖去了一块内容的矩形子代部件,并且添加到了亲代部件中(显示了一个位图的一个QLabel)。 然后,设置了不同的属性及部件属性,以实现不同的效果:

  • •.•.左边的部件,没有设置额外的属性或部件属性。这个默认状态适合于大部分使用了透明功能、具有不规则形状或不使用不透明画刷在整个区域中绘图的自定义部件。

  • •.•.中间的部件,设置了autoFillBackground属性。这个属性,用于那种依赖着部件本身提供的默认背景色并且不使用不透明的画刷在整个区域中绘图的自定义部件。

  • •.•.右边的部件,设置了Qt::WA_OpaquePaintEvent这个部件属性。这表明,该部件会在它的整个区域中使用不透明画刷来绘图。初始情况下,该部件的区域是未初始化的,在图中是以覆盖于已绘图区域之上的红色交叉线来表示的。Qt::WA_OpaquePaintArea属性适用于那种需要快速绘制它们自身的内容并且不需要默认的填充背景色的部件。

要想快速地使用简单的背景色来更新自定义部件的话,例如用于实时图表或图形部件,最好的处理方法是:定义一个合适的背景色(使用QPalette::Window角色调用setBackgroundRole()),设置好autoFillBackground属性,并且只在该部件的paintEvent()中实现必要的绘图功能。

要想快速地更新那些经常在整个区域中使用不透明内容绘制图形的自定义部件的话,例如用于显示视频流的部件,最好的处理方法是:设置该部件的Qt::WA_OpaquePaintEvent,以避免任何用于重绘该部件的背景的不必要开销。

如果一个部件同时设置了Qt::WA_OpaquePaintEvent这个部件属性 autoFillBackground这个属性的话,则Qt::WA_OpaquePaintEvent属性优先生效。取决于妳的需求,妳应当在二者之中只选其一。

从Qt 4.1开始,亲代部件的内容也会传递给标准的Qt 部件。如果该亲代部件被以一种非标准的方式装饰的话,这种特性可能引起某些未预期的结果,例如下图所示。

对于标准的Qt 部件,要想在不进行子类化的情况下就对绘图行为进行自定义的话,其可能性比自定义部件要小。通常情况下,可通过设置autoFillBackground属性来让一个标准部件达到预期的显示效果。

创建半透明的窗口

从Qt 4.5开始,可以在支持合成特效的窗口系统中创建带有半透明区域的窗口了。

要在一个顶级部件中启用这个特性的话,以Qt::WA_TranslucentBackground属性为参数来调用setAttribute(),并且,在妳希望它显示成半透明的那些区域中,确保背景是以半透明的颜色绘制的。

平台相关的注意事项:

  • •.•.X11: 这个特性依赖于一个支持ARGB 视觉效果的X服务器以及一个组合式窗口管理器。

原生部件与外来部件的对比

此概念从Qt 4.4开始引入,外来部件指的是窗口系统不知道的部件。它们不具有与之相关联的原生窗口把柄(handle)。这个特点,显著地加快了部件的绘制、尺寸改变,并且去除了闪烁。

如果妳想要恢复为使用原生窗口的行为的话,可以采用以下某种方式来实现:

1.在环境变量中设置QT_USE_NATIVE_WINDOWS=1。

2.给妳的程序设置Qt::AA_NativeWindows属性。所有的部件都会变成原生部件。

3.给单独的部件设置Qt::WA_NativeWindow属性:该部件本身及它的所有祖先部件都会成为原生部件(除非另外设置了Qt::WA_DontCreateNativeAncestors)。

4.调用QWidget::winId,这会强制变成一个原生窗口(这会隐式触发3中的动作)。

5.设置Qt::WA_PaintOnScreen属性,这会强制变成一个原生窗口(这会隐式触发3中的动作)。

参考QEventQPainterQGridLayout QBoxLayout

属性文档

acceptDrops : bool

这个属性记录的是,此部件是否启用了拖放事件相关的功能。

将这个属性设置为真(true),则是向系统声明了,此部件 可能 能够接收鼠标扔下事件。

如果 此部件是桌面 ( windowType () ==  Qt::Desktop ) ,则, 当另一个程序在使用桌面时,此属性可能会失败; 妳可以调用 acceptDrops() 来检查是否是出现了这种情况。

警告: 不要在拖放事件处理器中修改这个属性的值。

默认情况下,此属性为假(false)。

访问函数

bool

acceptDrops() const

void

setAcceptDrops(bool on)

参考 拖放

enabled : bool

这個属性控制的是此部件的启用状态。

一般情况下,处于启用状态的部件會处理键盘和鼠标事件;处于禁用状态的部件不會处理。 QAbstractButton 是一个例外。

某些部件在处于禁用状态时會改变自己的外观。比如说,一個按钮可能會将它的标签变成灰色的。如果妳需要在部件的启用状态发生改变时得知这個改变信息,那么妳可以使用changeEvent()函数,并且处理QEvent::EnabledChange类型的事件。

禁用一個部件时會隐式禁用它的所有子代部件。同样地,启用某個部件时,也會启用它的全部子代部件,除非某些子代部件曾被显式禁用过。对于一个本身并不是窗口的子代部件,不可能在其亲代部件仍然保持禁用状态时显式地启用该子代部件。

默认值是真(true)。

访问函数:

bool

isEnabled () const

void

setEnabled ( bool )

参考isEnabledTo()、 QKeyEvent QMouseEvent 和changeEvent()。

font : QFont

这个属性保存的是当前为本部件设置的字体。

这个属性描述的是该部件所请求的字体。字体会被部件的风格用于渲染标准的组件,并且作为一种手段用于确保自定义部件可以拥有原生平台的观感。一种常见的情况是,在不同的平台上或不同的风格中,会为一个程序定义不同的字体。

当妳为一个部件设置一个新字体时,该字体的属性会与该部件的默认字体的属性组合起来,形成该部件的最终字体。妳可以调用fontInfo()来获取该部件的最终字体的一个副本。最终字体也会被用来初始化QPainter的字体。

默认取决于系统环境。QApplication维护着一个系统/主题字体,它会作为所有部件的默认字体。对于特定类型的部件,也可能存在着特殊的字体默认值。妳也可以自己为某些部件定义默认字体,具体做法就是调用QApplication::setFont(),并且传递一个自定义字体以及某个部件的名字。最终,该字体会根据Qt 的字体数据库进行匹配,以找出最佳匹配。

QWidget会从亲代部件向子代部件传递显式的字体属性。如果妳改变了某个字体中的一个特定属性,并且将该字体设置给某个部件的话,则,该属性会被传递给该部件的所有子代部件,进而覆盖掉针对该属性的任何系统默认值。注意,默认情况下,字体不会被传递给窗口(参考isWindow()),除非启用了Qt::WA_WindowPropagation属性。

QWidget的字体传递过程与它的调色板传递过程类似。

当前的系统风格,也就是被用来渲染所有标准Qt 部件的那个东西,可以自由决定是要使用该部件的字体还是在某种情况下忽略它(部或完全忽略)。特别地,某些风格,例如GTK风格,会向部件的字体中应用一些特殊的修改,以匹配该平台的原生观感。因为这一点,向某个部件的字体设置一些属性是无法确保一定能够改变该部件的外观的。作为一个替代手段,妳可能需要应用一个样式单(styleSheet)。

注意:如果Qt样式单与setFont()被应用于同一个部件上的话,则,在设置信息发生冲突的时候,样式单会优先生效。

访问函数:

const QFont &

font () const

void

setFont ( const QFont & )

参考fontInfo()和fontMetrics()。

mouseTracking : bool

这个属性保存的是是否为部件启用鼠标跟踪。

如果鼠标跟踪被禁用(默认),只有在最少一个鼠标按钮按下的情况下,部件才会在鼠标移动的时候收到鼠标移动事件。

如果鼠标跟踪被启用,甚至在没有按钮被按下的情况下,部件也会收到鼠标移动事件。

访问函数:

bool

hasMouseTracking () const

void

setMouseTracking ( bool enable )

mouseMoveEvent()

sizePolicy : QSizePolicy

这个属性保存的是此部件的默认布局行为。

如果有一个QLayout来管理此部件的子代部件的话,则会使用那个布局器指定的尺寸策略。如果没有这样一个QLayout,则会使用这个函数的返回值。

默认策略是Preferred/Preferred,意味着此部件可被任意改变大小,但偏向于保留sizeHint()函数返回的尺寸。按钮类的部件的尺寸策略表明它们可以水平地拉伸,但在竖直方向是固定的。类似地,输入条控件(例如QLineEditQSpinBox或一个可编辑的QComboBox)以及其它水平方向的部件(例如 QProgressBar)都是这样的。QToolButton一般是方形的,所以它们可以在两个方向都增长。那些支持不同方向的部件(例如QSliderQScrollBar或QHeader)只在相应的方向指定拉伸策略。那些可以提供滚动条的部件(通常是QScrollArea的子类)可能会声明说它们可以使用额外的空间,同时在所获得的空间小于sizeHint()的情况下也能正常工作。

访问函数:

QSizePolicy

sizePolicy () const

void

setSizePolicy ( QSizePolicy )

void

setSizePolicy ( QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical )

参考sizeHint()、QLayoutQSizePolicy和updateGeometry()。

visible : bool

这个属性管理的是这个部件是否可见.

在这个窗口的全部亲代部件都可见的情况下,调用setVisible(true)或者show() 会将这个部件设置为可见状态如果某个祖先部件不可见的话那么这个部件不会变成可见状态直到所有的祖先都显示出来才会变成可见状态如果它的大小或者位置发生咯改变,那么Qt会确保它在显示之前接收到移动和改变大小事件如果这个部件还没有改变过大小的话,那么Qt 会使用adjustSize()来将它的大小调整成一个适当的默认值

调用setVisible(false)或者hide()会显式地将一个部件隐藏起来对于一个显式隐藏的部件来说除非你显示(show)它否则即使它的全部祖先部件都可见的话它也不会变得可见

当一个部件的可见性发生改变时会接收到显示和隐藏事件在一个隐藏事件和一个显示事件之间没必要浪费 CPU 时间片来准备或者向用户显示信息咯比如说一个视频程序在这个时候就可以简单地停止生成新的帧

一个偶然被屏幕上其它窗口挡住的部件仍然被认为是可见的对于图标化的窗口和位于其它(在支持这个概念的平台上)虚拟桌面上的窗口也是一样当一个部件的映射状态被窗口系统改变时它会接收到自然的显示和隐藏事件例如当用户将窗口最小化时窗口会接收到一个自然的隐藏事件当窗口被恢复时又会接收到一个自然的显示事件

你几乎不需要覆盖setVisible()函数如果你需要在一个部件显示出来之前改变某些设置的话就使用showEvent()如果你需要做一些延迟性的初始化的话那么就使用传递给event()函数的光泽(Polish)事件

访问函数:

bool

isVisible () const

virtual void

setVisible ( bool visible )

参考show()、hide()、isHidden()、isVisibleTo()、isMinimized()、showEvent()和hideEvent()。

成员函数文档

void  QWidget:: addAction ( QAction  * action )

将动作 action 追加到这个部件的动作列表中。

所有 QWidget 都拥有一个 QAction 列表,但是,它们 在视觉上可能会以完全不同的形式呈现。 QAction 列表 actions () 返回 )的默认用途是,用来创建 一个上下文菜单 QMenu

一个 QWidget ,对于其中的每个动作,应当 只拥有一个实例,并且 向其中加入它已经拥有的动作, 并不会导致该动作被向该部件中添加两次。

action 的所有权并不会被转换到这个 QWidget 中。

参考 removeAction () insertAction () actions () QMenu

QRect QWidget::contentsRect () const

返回位于这個部件的边距(margins)内部的区域。

setContentsMargins()和getContentsMargins()。

void  QWidget:: dragEnterEvent ( QDragEnterEvent  *  event )  [virtual protected]

在以下情况下,此事件处理器函数会被调用:某个拖放操作正在进行中,并且鼠标进入了这个部件的区域。事件的信息是以参数 event 传入的。

如果 此事件被忽略的话,则, 此部件不会接收到任何的 拖放移动事件

参考 拖放文档 以了解如何在妳的程序中加入拖放功能。

参考 QDrag QDragEnterEvent

void  QWidget:: dragLeaveEvent ( QDragLeaveEvent  *  event )  [virtual protected]

在以下情况下,此事件处理器函数会被调用:某个拖放操作正在进行中,并且鼠标离开了这个部件的区域。事件的信息是以参数 event 传入的。

参考 拖放文档 以了解如何在妳的程序中加入拖放功能。

参考 QDrag QDragLeaveEvent

void  QWidget:: dropEvent ( QDropEvent  *  event )  [virtual protected]

当拖放操作中的内容被扔到这个部件上时,会调用此事件处理器函数。事件的信息是以参数 event 传入的。

参考 拖放文档 以了解如何在妳的程序中加入拖放功能。

参考 QDrag QDropEvent

void QWidget::grabGesture ( Qt::GestureType gesture, Qt::GestureFlags flags = Qt::GestureFlags() )

按照特定的标志位flags,将本部件订阅至指定的手势gesture。

此函数是从Qt 4.6开始引入的。

参考ungrabGesture()和QGestureEvent

void QWidget::mouseMoveEvent ( QMouseEvent * event ) [virtual protected]

这个事件处理器,处理的是事件event,可在子类中重写,以便接收那个部件的鼠标移动事件。

如果鼠标跟踪功能被关掉咯的话,那么只有在鼠标按钮被按下的情况下移动鼠标才会出现鼠标移动事件。如果鼠标跟踪功能被启用的话,那么,即使不按下按钮,也会出现鼠标移动事件。

QMouseEvent::pos()报告出鼠标指针相对于此部件的位置。对于按下(press)和松开(release)事件,其位置通常与最后一次鼠标移动事件的位置相同,但是,如果用户的手在抖的话就不一定咯。至于手抖的情况下究竟会怎么样,这个取决于底层的窗口系统,而不是Qt。

如果你想在鼠标移动的时候立即显示一个提示信息(比如,使用QMouseEvent::pos()来获取鼠标坐标,再用提示框显示出来)的话,那么你必须先按照上面所说的启用鼠标跟踪功能。然后,要确保提示框立即更新的话,你必须在mouseMoveEvent()中调用QToolTip::showText(),而不是调用setToolTip()。

setMouseTracking ()、 mousePressEvent ()、 mouseReleaseEvent ()、 mouseDoubleClickEvent ()、 event ()、 QMouseEvent 涂鸦示例

void QWidget::setContentsMargins ( int left, int top, int right, int bottom )

将本部件周围的边距设置成left、top、right和bottom。边距会被布局系统使用,并且可能被子类用于指定要在其中绘制的区域(例如,排除边框)。

改变边距会触发一个resizeEvent()事件。

参考contentsMargins()、contentsRect()和getContentsMargins()。

void QWidget::setFocus ( Qt::FocusReason reason )

如果本部件或其中的某个亲代部件是活跃窗口的话,则将键盘输入焦点赋予给本部件(或它的焦点代理)。reason参数会被传递由本函数触发的任何一个焦点变更事件函数中,它被用于解释为什么本部件获得了焦点。如果本部件所在的窗口当前不是活跃窗口,则,本部件会在窗口变成活跃窗口时获取到焦点。

首先,会向当前拥有焦点的部件(如果存在的话)发送一个焦点即将移出事件,以告它即将失去焦点。然后焦点发生改变,会向前一个拥有焦点的部件发送一个焦点移出事件,向本部发送一个焦点移入事件,以告它刚刚接收到焦点。(如果失去焦点和获取焦点的部件是同一个部件的话,则什么事都不会发生。)

注意 在嵌入式平台中, setFocus () 不会引起输入法显示出一个输入面板。如果 妳希望做出 这种行为,那么 ,就需要自己向该部件发送一个 QEvent::RequestSoftwareInputPanel 事件。
setFocus()会无视掉部件的焦点策略而直接赋予它焦点,但是不会清除任何的键盘抓取状态(参考grabKeyboard())。

注意,如果本部件处于隐藏状态,则,它只会到显示出来的时候才接收焦点。

警告:如果妳在一个本身可能会被focusOutEvent()或focusInEvent()调用的函数中调用setFocus()的话,可能引起无限递归。

参考hasFocus()、clearFocus()、focusInEvent()、focusOutEvent()、setFocusPolicy()、focusWidget()、QApplication::focusWidget()、grabKeyboard()、grabMouse()、部件 键盘焦点QEvent::RequestSoftwareInputPanel

void QWidget::setFocus () [slot]

这是一个重载函数。

如果本部件或其中的某个亲代部件是活跃窗口的话,则将键盘输入焦点赋予给本部件(或它的焦点代理)。

void QWidget::setMask ( const QBitmap & bitmap )

引起本部件中只有在bitmap里对应位置有一个1值的像素才处于可见状态。如果指定的区域中包含了超出本部件的rect()的范围的像素的话,则,在那个区域中的窗口系统控件可能会可见也可能会不可见,这取决于平台。

注意,如果指定的区域特别复杂的话,这个效果会使程序变慢。

以下代码,展示了,如使用一个带有透明通道的图片来为一个部件生成一个掩膜:

QLabel topLevelLabel;

QPixmap pixmap(":/images/tux.png");

topLevelLabel.setPixmap(pixmap);

topLevelLabel.setMask(pixmap.mask());

这段代码中显示出来的文本标签,会被它本身所包含的图片作掩膜处理,这样就会造成一种效果,就好像一张非规则形状的图片被直接绘制到屏幕上去了一样。

被掩膜处理的部件,只会在它们内部可见的位置处接收到鼠标事件。

参考mask()、clearMask()、windowOpacity()和带形状的时钟示例

[virtual protected] void  QWidget:: wheelEvent ( QWheelEvent  *  event )

这个事件处理器,用来处理事件 event ,可在子类中进行覆盖,以接收到针对该部件的滚轮事件。

如果 妳覆盖了这个处理器函数,那么,有一点狠重要,即, 当妳不处理它时,要忽略( ignore() )它, 这样,它的亲代部件就能够处理它了。

默认的实现中,会忽略这个事件。

参考 QWheelEvent::ignore () QWheelEvent::accept () event () QWheelEvent

未知美人

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands