1、说明

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

QWidget是用户界面的原子类。它接收鼠标、键盘和来自系统的其他事件,并在屏幕上将它们绘制出来。每个Widget都是矩形的,并按照Z-order(Z轴)进行排序。一个Widget夹在它的Parent和它前面的Widget之间。

没有嵌入parent widget中的Widget称为Window。通常情况下,Windows有一个Frame和标题栏(当然也可以通过window flags来取消这些项)。Qt中,QMainWindow和QDialog的多种多样的子类是最常见的Window类型。

每个Widget的构造函数接收一或两个参数:

  1. QWidget *parent =
    nullptr:新Widget的Parent。如果它是nullptr(这也是默认选项),那么新Widget将会是一个Window;如果不是,那么它将成为parent的子孙,并且将限制在parent的几何空间内(除非指明Qt::Window为Window
    Flag)。
  2. Qt::WindowFlags f = { } :Window
    Flags。实际上默认的参数已经满足绝大多数Widget了;不过一些特殊情况下,例如产生一个不需要Frame的Window时,我们需要一些特殊的Flags。

QWidget有许多成员函数,但是其中一些几乎没有直接功能;例如,QWidget有一个font属性,但是它自己从不使用它。也有许多子类提供了真实的功能,如QLabel, QPushButton, QListWidget 和 QTabWidget

1)顶层(Top-Level)和子Widget
没有Parent的Widget是独立Window(顶层Widget)。对于这类Widget,setWindowTitle() 可以用 setWindowIcon()来设置标题和图标。

非Window Widget(有Parent)是子Widget,它在Parent Widget中显示。Qt中的大多数Widget都是作为子Widget应用的。例如,QLabel, QPushButton等小的常见控件。

上图展示了QGroupBox Widget,它用于承接多种子Widget,这些子Widget通过QGridLayout进行布局。QLabel被红框框中指示它们的完整大小。

如果你想用一个QWidget来保留子Widget,我们通常需要往Parent Widget中添加布局,方法见Layout Management。

2)组合Widget
当一个Widget被用于一组Child Widgets组合的容器时,它被视为一个组合Widget。可以在Qt Designer中很方便地构造一个组合Widget。

还可以在创造Widget时指定Layout和Child Widget,来构造组合Widget。许多Qtl例子都用到了这种方法(examples provided with Qt),这些在Qt教程(Tutorials.)中也有提到。

3)定制Widget与绘制
由于QWidget是QPaintDevice的子类,所以Child Widget可以用QPainter对象来自定义绘制内容。

每个Widget都从它的paintEvent()函数中执行全部绘图操作。每当Widget需要重绘,比如一些外部改变或内部应用请求,都会调用它。

一个例子:Analog Clock example展示了一个Widget如何处理绘图事件。

4)大小提示与大小策略
当实现一个新Widget时,通常用sizeHint()来设置Widget的默认大小;用setSizePolicy()来设置正确的大小策略。

默认情况下,没有给出大小提示的组合Widget的大小将根据其Child Widget的控件需要来自适应。

大小策略给我们提供了用于布局管理的默认行为,这样其他的Widgets就能很方便地管理我们的Widgets。默认的大小策略指示了Widget合适的大小,而且对大多数Widgets来说都是够用的。

注意:
顶层Widget的大小限制为桌面长宽的2/3。如果嫌不合适,可以用resize()来手动修改Widget大小。

5)事件
Widget通过调用QEvent规定的函数来处理事件。

如果我们的Widget只包含了Child Widgets,那么通常情况下我们不需要实现任何事件响应。如果我们想检测Child Widget中的鼠标点击,可以在Widget的mousePressEvent()中调用Child的underMouse()函数。

例子:Scribble example实现了更广泛的事件集合来处理鼠标移动、按钮按下、窗口大小重定义。

我们需要为我们的Widgets提供行为和内容,以下是与QWidget相关的事件的概述:

鼠标

  1. paintEvent():每当Widget需要重绘时调用;每个展示自定义内容的Widget必须实现该方法。QPainter的绘制只能用于paintEvent()或被paintEvent()调用的函数中;
  2. resizeEvent():每当窗口大小重定义时调用该方法;
  3. mousePressEvent():每当鼠标光标在Widget中并且被按下时、或者每当Widget通过grabMouse()抓取鼠标时使用该方法。此外,按住鼠标不放开时,和调用grabMouse()的效果相同;
  4. mouseReleaseEvent():每当放开鼠标按钮时调用该方法;
  5. mouseDoubleClickEvent():每当双击鼠标时调用该方法。

键盘

  1. keyPressEvent():每当键盘按键按下时调用;Tab和Shift+Tab键只有在没有focus-change机制时才会传给Widget。
  2. focusInEvent():当Widget获取到了键盘focus(假设已经调用了setFocusPolicy())时才会被调用。
  3. focusOutEvent():当Widget失去键盘focus时调用该方法。

其他一些事件

  1. mouseMoveEvent() :按住鼠标键移动时发送该信号,常用于拖拽操作;
  2. keyReleaseEvent():松开键盘;
  3. wheelEvent():鼠标滚轮;
  4. enterEvent():鼠标进入Widget;
  5. leaveEvent():鼠标离开Widget;
  6. moveEvent():Widget相对于其Parent移动时;
  7. closeEvent():关闭Widget时。

6)函数、属性组
窗口函数

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()

Mode

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().

上下文菜单

contextMenuPolicy,

contextMenuEvent(),

customContextMenuRequested(),

actions()

交互

setToolTip(),

setWhatsThis()

7)Widget样式表

除了标准Widget样式外,Widget也可以通过style sheet指定的规则进行样式设置。该特性允许我们定制Widget的外观。

8)透明度与双重缓存(double-buffer)

从Qt 4.0开始,QWidget将在绘制时自动进行双重缓存,所以我们不需要在paintEvent()中写双重缓存的代码。

从Qt 4.1开始,只要没有设置Qt::WA_PaintOnScreen,那么Parent Widget就会自动传播到它的每一个Child Widget中。定制的Widget可以利用这一特定的优势来更新不规则的区域(创建非矩形子部件)。下图展示了如何修改定制Widget的属性来更好地实现不同的效果。

上图中,一个半透明的矩形Child Widget中有一些区域被移除了,之后把它加到一个Parent Widget中。之后,修改不同的属性来实现不同的效果:

  1. 左边:不设置任何属性和参数。这种默认状态适合大多数使用了透明度、不规则形状的定制Widget。
  2. 中间:设置了autoFillBackground属性,会自动填充背景。
  3. 右边:设置了Qt::WA_OpaquePaintEvent参数,使用不透明的颜色绘制整个区域。Widget的区域最初是未初始化的,在图中用红色对角网格表示并覆盖这些区域。该属性对于需要快速绘制特定内容和不需要填充背景的Widget的小部件很有用。

1、模块和加载项

Header: #include
qmake: QT += widgets
Inherits: QObject and QPaintDevice

2、构造

QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

3、静态字段

enum RenderFlag { DrawWindowBackground, DrawChildren, IgnoreMask } 调用QWidget::render()时如何呈现Widget
flags RenderFlags

4、实例字段

类型 字段 说明 getter、setter方法
bool acceptDrops 是否允许drop事件 acceptDrops(),setAcceptDrops(bool on)
QString accessibleDescription Widget的描述性语句 accessibleDescription(),setAccessibleDescription(const QString &description)
QString accessibleName Widget的名字 accessibleName(),setAccessibleName(const QString &name)
bool autoFillBackground 背景是否自动填充 autoFillBackground(),setAutoFillBackground(bool enabled)
QSize baseSize 基本大小 baseSize(),setBaseSize(const QSize &),setBaseSize(int basew, int baseh)
QRect childrenRect 该Widget的Child相关矩形 childrenRect()
QRegion childrenRegion 该Widget的Child相关Region childrenRegion()
Qt::ContextMenuPolicy contextMenuPolicy Widget如何显示上下文菜单 contextMenuPolicy(),setContextMenuPolicy(Qt::ContextMenuPolicy policy)
QCursor cursor 光标形状 cursor(),setCursor(const QCursor &),unsetCursor()
bool enabled 是否启用 isEnabled(),setEnabled(bool)
bool focus Widget是否有个键盘输入焦点 hasFocus()
Qt::FocusPolicy focusPolicy Widget接收键盘焦点的方式 focusPolicy(),setFocusPolicy(Qt::FocusPolicy policy)
QFont font 当前Widget采用的字体 font(),setFont(const QFont &)
QRect frameGeometry 框架矩形(包含Window Frame) frameGeometry()
QSize frameSize 框架大小 frameSize()
bool fullScreen 是否全屏 isFullScreen()
QRect geometry 框架矩形(不包含Window Frame) geometry(),setGeometry(int x, int y, int w, int h),setGeometry(const QRect &)
int height 高度 height()
Qt::InputMethodHints inputMethodHints
bool isActiveWindow 是否活动 isActiveWindow()
Qt::LayoutDirection layoutDirection 布局方向 layoutDirection(),setLayoutDirection(Qt::LayoutDirection direction),unsetLayoutDirection()
QLocale locale 本地配置 locale(),setLocale(const QLocale &locale),unsetLocale()
bool maximized 是否最大化 isMaximized()
int maximumHeight 最大高度 maximumHeight(),setMaximumHeight(int maxh)
QSize maximumSize 最大尺寸 maximumSize(),setMaximumSize(const QSize &),setMaximumSize(int maxw, int maxh)
int maximumWidth 最大宽度 maximumWidth(),setMaximumWidth(int maxw)
bool minimized 是否最小化 isMinimized()
int minimumHeight 最小高度 minimumHeight(),setMinimumHeight(int minh)
QSize minimumSize 最小尺寸 minimumSize(),setMinimumSize(const QSize &),setMinimumSize(int minw, int minh)
QSize minimumSizeHint 推荐的最小尺寸 minimumSizeHint()
int minimumWidth 最小宽度 minimumWidth(),setMinimumWidth(int minw)
bool modal 该Widget是否是模态Widget isModal()
bool mouseTracking 是否启用鼠标追踪 hasMouseTracking(),setMouseTracking(bool enable)
QRect normalGeometry
QPalette palette Palette palette(),setPalette(const QPalette &)
QPoint pos Widget在Parent Widget中的位置 pos() ,move(int x, int y),move(const QPoint &)
QRect rect 该Widget对应的内部几何形状 rect()
QSize size 该Widget对应的内部几何形状的大小 size(),resize(int w, int h),resize(const QSize &)
QSize sizeHint Widget的推荐大小 sizeHint()
QSize sizeIncrement 缩放时的大小增量 sizeIncrement(),setSizeIncrement(const QSize &),setSizeIncrement(int w, int h)
QSizePolicy sizePolicy 默认布局策略 sizePolicy(),setSizePolicy(QSizePolicy),setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
QString statusTip 状态标签 statusTip(),setStatusTip(const QString &)
QString styleSheet 样式表 styleSheet(),setStyleSheet(const QString &styleSheet)
bool tabletTracking 是否启用平板跟踪 hasTabletTracking(),setTabletTracking(bool enable)
QString toolTip 工具标签 toolTip(),setToolTip(const QString &)
int toolTipDuration 工具标签持续时间 toolTipDuration(),setToolTipDuration(int msec)
bool updatesEnabled 是否允许更新 updatesEnabled(),setUpdatesEnabled(bool enable)
bool visible 是否可见 isVisible(),setVisible(bool visible)
QString whatsThis "帮助"文本 whatsThis(),setWhatsThis(const QString &)
int width 宽度 width()
QString windowFilePath Widget相关的文件路径 windowFilePath(),setWindowFilePath(const QString &filePath)
Qt::WindowFlags windowFlags Window Flags windowFlags(),setWindowFlags(Qt::WindowFlags type)
QIcon windowIcon Widget的图标 windowIcon(),setWindowIcon(const QIcon &icon)
Qt::WindowModality windowModality
bool windowModified Window是否修改(未保存) isWindowModified(),setWindowModified(bool)
double windowOpacity 不透明度 windowOpacity(),setWindowOpacity(qreal level)
QString windowTitle 标题 windowTitle(),setWindowTitle(const QString &)
int x Widget在Parent中的x坐标 x()
int y Widget在Parent中的y坐标 y()

QT学习总结之QWidget详解相关推荐

  1. Qt学习总结之QPushbutton详解

    一.简述 按钮,界面中常用的控件,默认矩形. QPushButton的子类:QCommandLinkButton 父类:QAbstractButton.QAbstractButton的父类是QWidg ...

  2. QT学习总结之QObject详解

    QObject简单介绍 QObject是QT框架的核心,在该对象内可以使用QT框架的信号和槽机制. 一个QObject对象创建在另一个QObject类(该类可以称作父类)中,该对象将自动将其自身添加到 ...

  3. 学习QT之信号槽机制详解

    学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...

  4. Qt QListWidget列表框用法详解

    Qt QListWidget列表框用法详解 很多应用程序中需要以列表的形式向用户展示数据(资源),比如 Windows 操作系统会以列表的方式展示很多张桌面背景图(如图 1a) 所示),再比如很多音乐 ...

  5. Qt QLineEdit单行输入框用法详解

    Qt QLineEdit单行输入框用法详解 QLineEdit 是 Qt 提供的一个控件类,它直接继承自 QWdiget 类,专门用来创建单行输入框,如下图所示: 图 1 单行文本输入框 实际开发中, ...

  6. QT QTabWidget 控件 使用详解

    本文详细的介绍了QTabWidget控件的各种操作,例如:新建界面.设置页面名字.设置提示信息.设置页面激活.设置标题栏位置.设置页面关闭按钮.设置页面关闭按钮.获取页面下标.获取页面总数.清空所有页 ...

  7. Qt之布局设置setLayout详解-源码剖析(下)

    一.简述 大家好,我是前行中的小猪,今天呢给大家继续上一篇Qt之布局设置setLayout详解(上)之后的内容,再给大家进行一下拓展. 1.1 setLayout源码剖析 上篇我们说到如何清空部件上的 ...

  8. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  9. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

最新文章

  1. FCN模型训练中遇到的困难
  2. boost::polygon模块voronoi相关的测试程序
  3. Java面向对象(13)--==操作符与equals方法
  4. Attribute鲜为人知的两个特性记录
  5. Matlab 中prod函数的使用
  6. 爆笑~~偶和老公滴愚人笑话~~~
  7. 无SSH工具部署网站到火腿云
  8. 论文笔记_S2D.29_2017_CVPR_多尺度连续CRFs作为序列深度网络的单目深度估计
  9. ros清华源_ROS操作系统学习(一)ROS安装
  10. 面向创新设计的汽车外形曲面三维逆向建模
  11. [转] Ubuntu 16.04 RTL8111/8168/8411 不能上网 经常断网解决办法
  12. (JAVA编程练习):输入两个正整数m和n,求其最大公约数和最小公倍数。
  13. 蓝桥杯 ALGO-45 算法训练 调和数列问题
  14. 利用weevely生成php后门木马
  15. 虚拟路由冗余协议(VRRP)
  16. java pack unpack_解释一下pack和unpack
  17. 第一周学习前端html的知识总结与感悟
  18. ktv服务器几套系统,KTV场所需要哪些设备
  19. 买上空气净化器了,真好... ...
  20. 在会计研究中使用Python进行文本分析

热门文章

  1. 蒸汽幻想服务器修改,《蒸汽幻想》部分服务器资料互通公告
  2. 从蓝海到红海,净水器市场为何变了味?
  3. API获取自己的公网IP地址 API查询IP信息
  4. 两个scanf只运行了一个
  5. Redis学习笔记(一):介绍,数据类型(String、HashTable、List、Set、Sorted_Set)
  6. Java面试基础宝典
  7. 软件需求规格说明 (IEEE 830 标准)——数字化车间
  8. 详解IT项目管理的三个条件、五个步骤
  9. 达梦数据库中的nvl,ifnull,和isnull函数
  10. 手机自动化测试(模拟器版)