QT学习总结之QWidget详解

article/2025/10/13 4:20:25

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、静态字段

enumRenderFlag { DrawWindowBackground, DrawChildren, IgnoreMask }调用QWidget::render()时如何呈现Widget
flagsRenderFlags

4、实例字段

类型字段说明getter、setter方法
boolacceptDrops是否允许drop事件acceptDrops(),setAcceptDrops(bool on)
QStringaccessibleDescriptionWidget的描述性语句accessibleDescription(),setAccessibleDescription(const QString &description)
QStringaccessibleNameWidget的名字accessibleName(),setAccessibleName(const QString &name)
boolautoFillBackground背景是否自动填充autoFillBackground(),setAutoFillBackground(bool enabled)
QSizebaseSize基本大小baseSize(),setBaseSize(const QSize &),setBaseSize(int basew, int baseh)
QRectchildrenRect该Widget的Child相关矩形childrenRect()
QRegionchildrenRegion该Widget的Child相关RegionchildrenRegion()
Qt::ContextMenuPolicycontextMenuPolicyWidget如何显示上下文菜单contextMenuPolicy(),setContextMenuPolicy(Qt::ContextMenuPolicy policy)
QCursorcursor光标形状cursor(),setCursor(const QCursor &),unsetCursor()
boolenabled是否启用isEnabled(),setEnabled(bool)
boolfocusWidget是否有个键盘输入焦点hasFocus()
Qt::FocusPolicyfocusPolicyWidget接收键盘焦点的方式focusPolicy(),setFocusPolicy(Qt::FocusPolicy policy)
QFontfont当前Widget采用的字体font(),setFont(const QFont &)
QRectframeGeometry框架矩形(包含Window Frame)frameGeometry()
QSizeframeSize框架大小frameSize()
boolfullScreen是否全屏isFullScreen()
QRectgeometry框架矩形(不包含Window Frame)geometry(),setGeometry(int x, int y, int w, int h),setGeometry(const QRect &)
intheight高度height()
Qt::InputMethodHintsinputMethodHints
boolisActiveWindow是否活动isActiveWindow()
Qt::LayoutDirectionlayoutDirection布局方向layoutDirection(),setLayoutDirection(Qt::LayoutDirection direction),unsetLayoutDirection()
QLocalelocale本地配置locale(),setLocale(const QLocale &locale),unsetLocale()
boolmaximized是否最大化isMaximized()
intmaximumHeight最大高度maximumHeight(),setMaximumHeight(int maxh)
QSizemaximumSize最大尺寸maximumSize(),setMaximumSize(const QSize &),setMaximumSize(int maxw, int maxh)
intmaximumWidth最大宽度maximumWidth(),setMaximumWidth(int maxw)
boolminimized是否最小化isMinimized()
intminimumHeight最小高度minimumHeight(),setMinimumHeight(int minh)
QSizeminimumSize最小尺寸minimumSize(),setMinimumSize(const QSize &),setMinimumSize(int minw, int minh)
QSizeminimumSizeHint推荐的最小尺寸minimumSizeHint()
intminimumWidth最小宽度minimumWidth(),setMinimumWidth(int minw)
boolmodal该Widget是否是模态WidgetisModal()
boolmouseTracking是否启用鼠标追踪hasMouseTracking(),setMouseTracking(bool enable)
QRectnormalGeometry
QPalettepalettePalettepalette(),setPalette(const QPalette &)
QPointposWidget在Parent Widget中的位置pos() ,move(int x, int y),move(const QPoint &)
QRectrect该Widget对应的内部几何形状rect()
QSizesize该Widget对应的内部几何形状的大小size(),resize(int w, int h),resize(const QSize &)
QSizesizeHintWidget的推荐大小sizeHint()
QSizesizeIncrement缩放时的大小增量sizeIncrement(),setSizeIncrement(const QSize &),setSizeIncrement(int w, int h)
QSizePolicysizePolicy默认布局策略sizePolicy(),setSizePolicy(QSizePolicy),setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
QStringstatusTip状态标签statusTip(),setStatusTip(const QString &)
QStringstyleSheet样式表styleSheet(),setStyleSheet(const QString &styleSheet)
booltabletTracking是否启用平板跟踪hasTabletTracking(),setTabletTracking(bool enable)
QStringtoolTip工具标签toolTip(),setToolTip(const QString &)
inttoolTipDuration工具标签持续时间toolTipDuration(),setToolTipDuration(int msec)
boolupdatesEnabled是否允许更新updatesEnabled(),setUpdatesEnabled(bool enable)
boolvisible是否可见isVisible(),setVisible(bool visible)
QStringwhatsThis"帮助"文本whatsThis(),setWhatsThis(const QString &)
intwidth宽度width()
QStringwindowFilePathWidget相关的文件路径windowFilePath(),setWindowFilePath(const QString &filePath)
Qt::WindowFlagswindowFlagsWindow FlagswindowFlags(),setWindowFlags(Qt::WindowFlags type)
QIconwindowIconWidget的图标windowIcon(),setWindowIcon(const QIcon &icon)
Qt::WindowModalitywindowModality
boolwindowModifiedWindow是否修改(未保存)isWindowModified(),setWindowModified(bool)
doublewindowOpacity不透明度windowOpacity(),setWindowOpacity(qreal level)
QStringwindowTitle标题windowTitle(),setWindowTitle(const QString &)
intxWidget在Parent中的x坐标x()
intyWidget在Parent中的y坐标y()

http://chatgpt.dhexx.cn/article/kJJjTc7e.shtml

相关文章

VS2019安装与使用教程

VS2019安装与使用教程 可能有很多小伙伴们,知道VS2019这个软件,但是不知道怎么安装与使用,下面我将具体介绍VS2019的安装方法与创建我们自己的C项目以及如何运行自己编写的代码! Visual Studio 2019(VS2019)简介 Microsoft Visual…

vs2017初学c++环境配置及使用教程

作为一个计算机小白, 初学c的时候使用了vs2017, 配置环境如下 如图所示, 可以实现c的基本操作. 在vs2017的版本中, 取消了win32这个选项, 所以直接选择新建空项目. 在解决方案资源管理器中, 于源文件处新建.cpp文件, 即可执行操作. 如果出现闪现的情况, 则右键点击解决方案资…

【转载】VS2019使用技巧

大家好,今天分享几个我知道的实用 VS 技巧,而这些技巧我发现很多人都不知道。因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS “骚”操作,他们会好奇地问&#xf…

VS2019安装教程

VS2019安装教程 (如果下面的博客没有能解决你的问题或者你还有其他关于计算机方面的问题需要咨询可以加博主QQ:1732501467) 在安装完JDK后,现在还不能使用java来进行编程,此时你还需要一个java开发工具,其…

VS2017专业版使用最新版Qt5.9.2教程(最新教材)

VS2017专业版使用最新版Qt5.9.2教程(最新教材) 目录 VS2017专业版使用最新版Qt5.9.2教程(最新教材) 运行环境: 1.安装Qt5.9.2 2.安装Qt5.9与VS2017之间的插件: 3.配置Qt VS Tool的环境. 4.设置创建的Qt的项目的…

Visual Studio(VS)2013使用教程

目录 1、初始2、新建项目3、点下一步后,此步后点完成4、解决方案资源管理器5、新建文件6、代码完成后不要点调试7、头文件显示:无法打开源文件路径未被包含若这一步没问题,则可能新建项时路径出错①添加包含目录级如上述②移除文件&#xff0…

Visual Studio 2017安装和使用教程(详细

Visual Studio 2017安装和使用教程&#xff08;详细&#xff09; 2018-10-09 01:02 来源:c语言程序设计官方 </div>原标题&#xff1a;Visual Studio 2017安装和使用教程&#xff08;详细&#xff09; 前言 说在前面&#xff0c;各位读者记得将 C语言程序设计 设置星标…

VS2019初步使用

前言 前段时间把电脑重置了下&#xff0c;导致很多软件都被删除了&#xff0c;所以重新安装了&#xff0c;顺便把一些“陈年落后”的软件更新到了最新版。新版的软件和之前相比的确区别很大&#xff0c;更人性化了、功能也增加了不少&#xff0c;体会最深的就是Adobe Photosho…

VS2017下载地址和安装教程(图解)

VS2017下载地址和安装教程&#xff08;图解&#xff09; 继 VS2015 版本后&#xff0c;微软又推出了功能更加强大的VS 2017。 Visual Studio 2017 不仅支持 C#、C、Python、Visual Basic、Node.js、HTML、JavaScript 等各大编程语言&#xff0c;还能开发 iOS、Android 的移动…

VS2019安装和使用教程

提示&#xff1a;安装过程请保持网络流畅。 安装篇 首先需要去官网下载安装工具&#xff1a;点击此处跳转 跳转到官网后&#xff0c;如下图所示&#xff0c;点击社区模块的免费下载&#xff0c;之后应该会自动下载安装工具&#xff0c;如果没有自动下载&#xff0c;可以根据提…

Visual Studio 2019/2017 安装使用教程(快速上手版)

Visual Studio 2017 安装使用教程&#xff08;详细&#xff09;在此鸣谢范华对本文工作的大力支持 一.下载二.安装 2017版本新建项目过程2019版本新建项目过程新建源文件然后你就可以简单编写一段代码测试一下啦三.特殊问题解决 1.运行闪退2.预编译头错误3.scanf错误四.运行及调…

Visual Studio 2017安装教程

目录 前言 Visual Studio的安装 Visual Studio中的“项目”和“解决方案” HelloWorld程序&#xff08;单项目&#xff09; 简易连加器程序&#xff08;多项目&#xff09; 前言 Visual Studio是微软&#xff08;Microsoft&#xff09;为以Windows为主的平台开发的一套功能…

visual studio新手使用教程

目录 1.下载安装Visual Studio 2.新建工程 3.新建项目 4.添加源文件 5.编译一闪而退的问题 6.使用scanf函数报错问题 7.VS常用调试程序快捷键 8.VS的调试窗口 9.工具->选项 对于刚刚接触编程的新手来说&#xff0c;最先需要熟练掌握的当然是语言之祖——C语言&…

Visual Studio 2019/2017 安装使用教程

目录 Part0.背景Part1.配置环境Part2.克隆项目Part3.单元测试Part4.基本操作 断点单步运行条件断言Part5.回归测试Part6.效能工具介绍Part7.提交代码 Part0.背景 阿超家里的孩子上小学一年级了&#xff0c;这个暑假老师给家长们布置了一个作业&#xff1a;家长每天要给孩子出…

最详细的vs2015使用教程(有图)

一 启动 visual studio 2015 稍等片刻&#xff0c;你就会看到这个界面&#xff1a; 点击菜单&#xff1a;”文件”-“新建”-“项目”&#xff0c;会出现这个窗口&#xff1a; 选择左侧的”Visual C”下面的“win32”之后&#xff0c;选择右侧的”win32控制台应用程序”&a…

visual studio 2019安装教程(详细的很)

1.vs2019安装教程 更新说明&#xff0c;由于现在vs已经2022版本了&#xff0c;但是我博客提供的是2019的安装教程&#xff0c;所以这里我会放出最新版与2019版本的安装位置&#xff08;因为时间问题我暂时没有办法修改博客的安装教程为最新版&#xff0c;望大家理解_&#xff0…

VS2019 使用教程

1.创建一个新的项目&#xff08;Create a new project&#xff09; 2.创建一个C空项目&#xff0c;选择Next 3.进入配置空项目窗口&#xff0c;第一步自定义项目名称&#xff0c;第二步自定义项目存储位置&#xff0c;第三步创建一个新的项目。 4.新项目创建完成如下图 5.鼠标右…

Visual Studio2017安装和使用教程(详细)

我一开始装的是vs2013&#xff0c;但是后来装了个插件后&#xff0c;突然就崩了&#xff0c;然后重装也没用&#xff0c;没办法只能选择vs2017了&#xff0c;我是看着这边文章装的&#xff0c;感觉受益匪浅&#xff0c;分享一下。 VS2017如此强大&#xff0c;不仅仅是C语言&…

Visual Studio 2019 详细安装和使用教程

简介 此处省略很多字 下载 社区版本下载网址&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads/ 选择安装路径 建议为VS2019新建一个专属的文件夹&#xff0c;用于存储安装包&#xff0c;安装信息等 在这里你可查看 快速入门指南&#xff0c;重命名安…

(详细图解)VS2017安装教程

VS 2017 版本同 15 版一样&#xff0c;细分为三个版本&#xff0c;分别是&#xff1a; 社区版&#xff08;Community&#xff09;&#xff1a;免费提供给单个开发人员&#xff0c;给予初学者及大部分程序员支持&#xff0c;可以无任何经济负担、合法地使用。企业版&#xff1a…