窗口QWidget
QWidget(self,
parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None,
f: PySide6.QtCore.Qt.WindowType=Default(Qt.WindowFlags))-> None
QWidget
是所有可视化组件的基类,所有可视组件直接或间接继承,QWidget
继承 QObject
,拥有其所有特性,
一个最简单的空白控件,接收各种事件(鼠标键盘),绘制在桌面上,展示给用户看。
- 每个控件都是矩形的,它们按Z轴顺序排序。
- 控件由其父控件和前面的控件剪切
- 没有父控件的控件,称之为窗口,系统会自动把之作为窗口处理
QWidget说明
详细说明
小部件是用户界面的原子:它从窗口系统接收鼠标、键盘和其他事件,并在屏幕上绘制自己的表示。每个小部件都是矩形的,并且按照Z顺序进行排序。一个小部件被它的父部件和它前面的小部件剪辑。
未嵌入父窗口小部件的窗口小部件称为窗口。通常,窗户有一个框架和一个标题栏,尽管也可以使用合适的窗户标志创建没有这种装饰的窗户。在Qt中,QMainWindow和QDialog的各种子类是最常见的窗口类型。
每个小部件的构造函数都接受一个或两个标准参数:
- QWidget*parent=nullptr是新小部件的父级。如果为None(无)(默认值),则新的小部件将是一个窗口。否则,它将是父对象的子对象,并受父对象的几何体约束(除非指定"窗口"作为窗口标志)。
- Qt::WindowFlags f={}(如果可用)设置窗口标志;默认值适用于几乎所有的窗口小部件,但例如,要获得一个没有窗口系统框架的窗口,必须使用特殊的标志。
QWidget有许多成员功能,但其中一些几乎没有直接功能;例如,QWidget有一个字体属性,但从不使用它本身。有许多子类提供了真正的功能,如QLabel、QPushButton、QListWidget和QTabWidget。
顶级和子级
没有父窗口小部件的窗口小部件始终是一个独立的窗口(顶级窗口小部件)。对于这些小部件,setWindowTitle()和setWindowIcon()分别设置标题栏和图标。
非窗口窗口小部件是子窗口小部件,显示在其父窗口小部件中。Qt中的大多数窗口小部件主要用作子窗口小部件。例如,可以将按钮显示为顶级窗口,但大多数人更喜欢将按钮放在其他小部件中,如QDialog。
上图显示了一个QGroupBox小部件,该小部件用于在QGridLayout提供的布局中保存各种子小部件。QLabel子窗口小部件已经被概述,以指示它们的完整尺寸。
如果您想使用QWidget来容纳子窗口小部件,通常需要在父QWidget中添加布局。有关详细信息,请参见布局管理。
复合小工具
当一个小部件被用作容器来分组多个子小部件时,它被称为复合小部件。可以通过构建具有所需可视财产的小部件(例如QFrame)并向其添加子小部件(通常由布局管理)来创建这些小部件。上图显示了这样一个使用Qt Designer创建的复合窗口小部件。
复合窗口小部件也可以通过对标准窗口小部件(如QWidget或QFrame)进行子类化来创建,并在子类的构造函数中添加必要的布局和子窗口小部件。Qt提供的许多示例都使用了这种方法,Qt小工具教程中也介绍了这种方法。
自定义小工具和绘画
由于QWidget是QPaintDevice的一个子类,因此子类可以用于显示自定义内容,这些内容是使用QPainter类实例的一系列绘制操作组成的。这种方法与图形视图框架使用的画布样式方法形成对比,在画布样式方法中,项目由应用程序添加到场景中,并由框架本身进行渲染。
每个小部件都在其paintEvent()函数中执行所有绘制操作。每当需要重新绘制小部件时,无论是由于某些外部更改还是应用程序请求,都会调用此函数。
"模拟时钟"示例显示了一个简单的小部件如何处理绘制事件。
尺寸提示和尺寸策略
在实现新的小部件时,重新实现sizeHint()为小部件提供合理的默认大小并使用setSizePolicy()设置正确的大小策略几乎总是很有用的。
默认情况下,不提供大小提示的复合窗口小部件将根据其子窗口小部件的空间要求进行大小调整。
大小策略允许您为布局管理系统提供良好的默认行为,以便其他小部件可以轻松地包含和管理您的小部件。默认的大小策略表示大小提示表示小部件的首选大小,这对于许多小部件来说通常足够好了。
顶级小部件的大小被限制为桌面高度和宽度的2/3。如果这些边界不足,您可以手动调整resize()小部件的大小。
事件
小工具响应通常由用户操作引起的事件。Qt通过使用包含每个事件信息的QEvent子类实例调用特定的事件处理程序函数,将事件传递到小部件。
如果您的小部件只包含子小部件,那么您可能不需要实现任何事件处理程序。如果您想检测到一个子窗口小部件中的鼠标点击,请在小部件的mousePressEvent()中调用子窗口小部件的underMouse()函数。
Scribble示例实现了一组更广泛的事件来处理鼠标移动、按钮按下和窗口大小调整。
您需要为自己的小部件提供行为和内容,但以下是与QWidget相关的事件的简要概述,从最常见的事件开始:
- 每当需要重新绘制小部件时,都会调用paintEvent()。每个显示自定义内容的小部件都必须实现它。使用QPainter绘制只能在paintEvent()或paintEvent调用的函数中进行。
- 调整小部件的大小时调用resizeEvent()。
- 当鼠标光标位于小部件内时按下鼠标按钮,或者小部件使用grabMouse()抓取鼠标时,调用mousePressEvent()。在不释放鼠标的情况下按下鼠标实际上与调用grabMouse()相同。
- 鼠标释放事件()是在释放鼠标按钮时调用的。小部件在接收到相应的鼠标按下事件时接收鼠标释放事件。这意味着,如果用户在小部件内按下鼠标,然后在释放鼠标按钮之前将鼠标拖动到其他地方,那么小部件就会收到释放事件。有一个例外:如果在按住鼠标按钮时出现弹出菜单,则此弹出菜单会立即窃取鼠标事件。
- 当用户双击小部件时,会调用mouseDoubleClickEvent()。如果用户双击,则小部件接收鼠标按下事件、鼠标释放事件、(鼠标单击事件)第二次鼠标按下、该事件以及最后的第二次小鼠释放事件。(如果在此操作过程中鼠标没有保持稳定,也可能会接收到一些鼠标移动事件。)在第二次点击到达之前,无法区分点击和双击。(这就是为什么大多数GUI书籍建议双击是单次单击的扩展,而不是触发不同的操作的原因之一。)
接受键盘输入的小工具需要重新实现更多的事件处理程序:
- 每当按下某个键时都会调用keyPressEvent(),当某个键被按住足够长的时间以使其自动重复时会再次调用。只有在焦点更改机制未使用Tab键和Shift+Tab键的情况下,才会将它们传递给小部件。要强制小部件处理这些键,必须重新实现event()。
- 当小部件获得键盘焦点时调用focusInEvent()(假设您已经调用了setFocusPolicy())。表现良好的小部件表明它们以一种清晰但谨慎的方式拥有键盘焦点。
- 当小部件失去键盘焦点时调用focusOutEvent()。
您可能还需要重新实现一些不太常见的事件处理程序:
- 每当鼠标在按住鼠标按钮时移动时,都会调用mouseMoveEvent()。这在拖放操作过程中非常有用。如果调用setMouseTracking(true),即使没有按下按钮,也会得到鼠标移动事件。(另请参见手册的拖放部分。)
- keyReleaseEvent()在释放键和按住键时调用(如果键是自动重复的)。在这种情况下,小部件每次重复都会收到一对按键释放和按键事件。只有在焦点更改机制未使用Tab键和Shift+Tab键的情况下,才会将它们传递给小部件。要强制小部件处理这些键,必须重新实现event()。
- 每当用户在小部件具有焦点时转动鼠标滚轮时,就会调用wheelEvent()。
- 当鼠标进入小部件的屏幕空间时,会调用enterEvent()。(这不包括小部件的任何子级拥有的屏幕空间。)
- 当鼠标离开小部件的屏幕空间时,会调用leaveEvent()。如果鼠标进入一个子窗口小部件,它将不会导致leaveEvent()。
- 当小部件相对于其父部件移动时,会调用moveEvent()。
- 当用户关闭小部件时(或当调用close()时)调用closeEvent()。
在Type的文档中也描述了一些相当模糊的事件。要处理这些事件,您需要直接重新实现event()。
event()的默认实现处理Tab和Shift+Tab(用于移动键盘焦点),并将大多数其他事件传递给上面一个更专业的处理程序。
事件和用于传递事件的机制在事件系统中进行了介绍。
函数组和属性
Context | Functions and Properties |
---|---|
窗口功能 | 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(). |
上下文菜单 | contextMenuPolicy,contextMenuEvent(),customContextMenuRequested(),actions() |
交互式帮助 | setToolTip(),setWhatsThis() |
小工具样式表
除了每个平台的标准小部件样式外,还可以根据样式表中指定的规则对小部件进行样式设置。此功能使您能够自定义特定小部件的外观,为用户提供有关其用途的视觉提示。例如,一个按钮可以以一种特定的方式进行样式设置,以指示它执行破坏性操作。
小部件样式表的使用在Qt样式表文档中有更详细的描述。
透明度和双重缓冲
自从Qt 4.0以来,QWidget自动对其绘画进行双缓冲,因此不需要在paintEvent()中编写双缓冲代码来避免闪烁。
自Qt 4.1以来,只要未设置WA_PaintOnScreen,父窗口小部件的内容默认会传播到其每个子窗口小部件。可以编写自定义窗口小部件,通过更新不规则区域(创建非矩形子窗口小部件),或使用小于完整alpha分量的颜色进行绘制来利用此功能。下图显示了如何微调自定义小部件的属性和财产以实现不同的效果。
在上图中,构造了一个去除了区域的半透明矩形子窗口小部件,并将其添加到父窗口小部件(显示像素图的QLabel)中。然后,设置不同的财产和小部件属性以实现不同的效果:
- 左侧小部件没有其他财产或小部件属性集。这种默认状态适用于大多数使用透明度、形状不规则或不使用不透明画笔在整个区域绘制的自定义小部件。
- 中心小部件具有autoFillBackground属性集。此属性用于依赖小部件提供默认背景的自定义小部件,并且不使用不透明画笔在其整个区域上绘制。
- 右侧小部件具有WA_OpaquePaintEvent小部件属性集。这表示小部件将在其整个区域上使用不透明的颜色进行绘制。该小部件的区域最初将被取消初始化,在图中用一个红色的对角网格图案表示,该图案穿过过度绘制的区域。Qt::WA_OpaquePaintArea属性对于需要快速绘制自己的专用内容且不需要默认填充背景的小部件非常有用。
要快速更新具有简单背景色的自定义小部件,如实时绘图或绘图小部件,最好定义一个合适的背景色(使用带有Window角色的setBackgroundRole()),设置autoFillBackground属性,并仅在小部件的paintEvent()中实现必要的绘图功能。
要快速更新不断在其整个区域绘制不透明内容的自定义小部件,例如视频流小部件,最好设置小部件的WA_OpaquePaintEvent,避免与重新绘制小部件背景相关的任何不必要的开销。
如果小部件同时具有WA_OpaquePaintEvent小部件属性和autoFillBackground属性集,则WA_Opaque PaintEvent属性优先。根据您的要求,您应该选择其中的任何一个。
由于Qt 4.1,父窗口小部件的内容也被传播到标准Qt窗口小部件。如果以非标准的方式装饰父窗口小部件,这可能会导致一些意外的结果,如下图所示。
在不使用子类化的情况下,自定义标准Qt小部件的绘画行为的范围略小于自定义小部件的范围。通常,可以通过设置其autoFillBackground属性来实现标准小部件所需的外观。
创建半透明窗口
自Qt 4.5以来,可以在支持合成的窗口系统上创建具有半透明区域的窗口。、
要在顶级小部件中启用此功能,请使用setAttribute()设置其WA_TranslucentBackground属性,并确保其背景在希望部分透明的区域中使用非不透明颜色绘制。
平台说明:
- X11:此功能依赖于使用支持ARGB视觉效果和合成窗口管理器的X服务器。
- Windows:小部件需要设置FramelessWindowHint窗口标志,半透明才能工作。
- macOS:小部件需要设置FramelessWindowHint窗口标志才能使半透明性工作。
Native Widgets vs Alien Widgets
在Qt 4.4中引入的外来窗口小部件是窗口系统未知的窗口小部件。它们没有关联的本机窗口句柄。此功能显著加快了小部件的绘制、调整大小和消除闪烁。
如果您需要使用本机窗口的旧行为,您可以选择以下选项之一:
- 在您的环境中使用QT_Use_NAMETIVE_WINDOWS=1。
- 在应用程序上设置AA_NativeWindows属性。所有小部件都将是本机小部件。
- 在小部件上设置WA_NativeWindow属性:小部件本身及其所有祖先都将变为本机(除非设置了WA_DontCreateNativeAncestors)。
- 调用winId以强制执行本机窗口(这意味着3)。
- 设置WA_PaintOnScreen属性以强制执行本机窗口(这意味着3)。
QWidget的属性
属性 | 描述 | 访问功能 |
---|---|---|
acceptDrops: bool | 此属性保存是否为此小部件启用了drop事件。 将此属性设置为true向系统宣布此小部件可能能够接受drop事件。 如果小部件是桌面(windowType()= = 桌面),则如果另一个应用程序正在使用桌面,则可能会失败; 您可以调用acceptDrops()来测试是否发生这种情况。 默认情况下,此属性为false。 不要在拖放事件处理程序中修改此属性。 | acceptDrops() setAcceptDrops(on) |
accessibleDescription: str | 此属性包含辅助技术看到的小部件描述。 小部件的可访问描述应传达小部件的功能。虽然可访问的名称应该是一个简短的字符串(例如Save),但描述应该提供更多的上下文,例如保存当前文档。 此属性必须本地化。 默认情况下,此属性包含一个空字符串,Qt返回到使用工具提示提供此信息。 | accessibleDescription() setAccessibleDescription(description) |
accessibleName: str | 此属性包含辅助技术看到的小部件名称。 这是辅助技术(如屏幕阅读器)宣布此小部件的主要名称。对于大多数小部件,不需要设置此属性。例如,对于qpush按钮,将使用按钮的文本。 当小部件不提供任何文本时,设置此属性非常重要。例如,仅包含图标的按钮需要将此属性设置为与屏幕阅读器一起使用。名称应简短,并等同于小部件传达的视觉信息。 此属性必须本地化。 默认情况下,此属性包含一个空字符串。 | accessibleName() setAccessibleName(name) |
autoFillBackground: bool | 此属性保存小部件背景是否自动填充。 如果启用,此属性将导致Qt在调用paint事件之前填充小部件的背景。所使用的颜色由窗口颜色角色从小部件的调色板中定义。 此外,窗口总是用窗口填充,除非设置了WA_OpaquePaintEvent或wa_nosystembackgrounds属性。 如果小部件的父级的背景具有静态渐变,则无法关闭此属性(即,设置为false)。 结合Qt样式表谨慎使用此属性。当小部件具有具有有效背景或边框图像的样式表时,此属性将自动禁用。 默认情况下,此属性为false。 | autoFillBackground() setAutoFillBackground(enabled) |
baseSize: PySide6.QtCore.QSize | 此属性保存小部件的基本大小。 如果小部件定义了sizeIncrement(),则基本大小用于计算适当的小部件大小。 默认情况下,对于新创建的小部件,此属性包含宽度和高度为零的大小。 | baseSize() setBaseSize(basew,baseh) |
childrenRect: PySide6.QtCore.QRect | 此属性保存小部件子级的边界矩形。 隐藏的孩子被排除在外。 默认情况下,对于没有子级的小部件,此属性包含位于原点的宽度和高度为零的矩形。 | childrenRect() |
childrenRegion: PySide6.QtGui.QRegion | 此属性保存小部件的子级占用的合并区域。 隐藏的孩子被排除在外。 默认情况下,对于没有子级的小部件,此属性包含一个空区域。 | childrenRegion() |
contextMenuPolicy: ContextMenuPolicy | 此属性保存小部件显示上下文菜单的方式。 此属性的默认值为defaultcontext菜单,这意味着调用了contextMenuEvent()处理程序。其他值包括无上下文菜单、预防性上下文菜单、操作上下文菜单和自定义上下文菜单。使用customcontext菜单,将发出信号customcontextmenurequest()。 | contextMenuPolicy() setContextMenuPolicy(policy) |
cursor: PySide6.QtGui.QCursor | 此属性保存此小部件的光标形状。 当鼠标光标越过此小部件时,它将呈现此形状。有关一系列有用形状,请参阅预定义游标对象列表。 编辑器小部件可能使用I-beam游标: setCursor(Qt.IBeamCursor) 如果未设置游标,或者在调用unsetCursor()之后,将使用父游标。 默认情况下,此属性包含具有ArrowCursor形状的游标。 如果光标离开小部件,即使鼠标被抓住,一些基础窗口实现也会重置光标。如果要为所有小部件设置游标,即使在窗口之外,也请考虑setOverrideCursor()。 | cursor() setCursor(arg__1) unsetCursor() |
enabled: bool | 此属性保存是否启用小部件。 通常,启用的小部件处理键盘和鼠标事件; 禁用的小部件不处理。Qabstract按钮出现异常。 一些小部件在被禁用时会以不同的方式显示自己。例如,一个按钮可能会将其标签绘制为灰色。如果您的小部件需要知道何时启用或禁用它,您可以将changeEvent()与EnabledChange类型一起使用。 禁用小部件会隐式地禁用其所有子部件。分别启用启用所有子小部件,除非已明确禁用它们。当其父小部件保持禁用状态时,无法显式启用不是窗口的子小部件。 默认情况下,此属性为true。 | isEnabled() setEnabled(arg__1) |
focus: bool | 此属性保存此小部件(或其焦点代理)是否具有键盘输入焦点。 默认情况下,此属性为false。 获取小部件的此属性的值实际上等同于检查focusWidget()是否引用小部件。 | hasFocus() |
focusPolicy: FocusPolicy | 此属性保持小部件接受键盘焦点的方式。 如果小部件通过点击接受键盘焦点,则策略为TabFocus; 如果小部件通过点击接受焦点,则单击焦点; 如果它同时接受两者,则为StrongFocus; 如果NoFocus(默认值)如果它根本不接受焦点。 如果小部件处理键盘事件,则必须为其启用键盘焦点。这通常是通过小部件的构造函数完成的。例如,QLineEdit构造函数调用setFocusPolicy(StrongFocus)。 如果小部件具有焦点代理,则焦点策略将传播到它。 | focusPolicy() setFocusPolicy(policy) |
font: PySide6.QtGui.QFont | 此属性保存当前为小部件设置的字体。 此属性描述小部件请求的字体。在渲染标准组件时,该字体由窗口小部件的样式使用,并且可以作为一种手段来确保自定义窗口小部件能够保持与本机平台的外观和感觉的一致性。通常,不同的平台或不同的样式会为应用程序定义不同的字体。 当您将新字体分配给小部件时,此字体的属性将与小部件的默认字体组合以形成小部件的最终字体。您可以调用fontInfo()来获取小部件最终字体的副本。最终字体也用于初始化QPainter的字体。 默认值取决于系统环境。QApplication维护系统/主题字体,作为所有小部件的默认字体。某些类型的小部件也可能有特殊的字体默认值。您还可以通过将自定义字体和小部件的名称传递给setFont()自己为小部件定义默认字体。最后,将字体与Qt的字体数据库进行匹配,以找到最佳匹配。 QWidget将显式字体属性从父级传播到子级。如果更改字体的特定属性并将该字体分配给小部件,则该属性将传播到小部件的所有子部件,从而覆盖该属性的任何系统默认值。请注意,默认情况下,字体不会传播到windows(请参阅isWindow()),除非启用了wa_windowcommunications属性。 QWidget的字体传播类似于其调色板传播。 当前样式用于呈现所有标准Qt小部件的内容,可以自由选择使用小部件字体,或者在某些情况下忽略它(部分,或完全)。特别是某些样式,如GTK样式、Mac样式和Windows Vista样式,对小部件字体进行特殊修改,以匹配平台的本机外观和感觉。因此,不能保证为小部件的字体分配属性会改变小部件的外观。相反,您可以选择应用样式表。 如果在与setFont()相同的小部件上使用Qt样式表,则在设置冲突时将以样式表为准。 | font() setFont(arg__1) |
frameGeometry: PySide6.QtCore.QRect | 此属性保存小部件相对于其父级的几何图形,包括任何窗口框架。 有关windows几何问题的概述,请参阅窗口几何文档。 默认情况下,此属性包含一个取决于用户平台和屏幕几何图形的值。 | frameGeometry() |
frameSize: PySide6.QtCore.QSize | 此属性保存小部件的大小,包括任何窗口框架。 默认情况下,此属性包含一个取决于用户平台和屏幕几何图形的值。 | frameSize() |
QWidget.fullScreen: bool | 此属性保存小部件是否以全屏模式显示。 全屏模式下的小部件占据整个屏幕区域,不显示窗口装饰,如标题栏。 默认情况下,此属性为false。 | isFullScreen() |
geometry: PySide6.QtCore.QRect | 此属性保存小部件相对于其父级的几何图形,不包括窗框。 更改几何图形时,小部件(如果可见)会立即接收移动事件(moveEvent())和/或调整大小事件(resizeEvent())。如果小部件当前不可见,则保证在显示之前接收到适当的事件。 如果尺寸组件位于minimumSize()和maximumSize()定义的范围之外,则会对其进行调整。 在resize事件()或move事件()中调用set几何体()可能导致无限递归。 有关windows几何问题的概述,请参阅窗口几何文档。 默认情况下,此属性包含一个取决于用户平台和屏幕几何图形的值。 | geometry() setGeometry(arg__1) |
height: int | 此属性保存不包括任何窗框的小部件的高度。 有关windows几何问题的概述,请参阅窗口几何文档。 默认情况下,此属性包含一个取决于用户平台和屏幕几何图形的值。 | |
inputMethodHints: InputMethodHints | 此属性包含小部件的输入法特定提示。 这仅与输入小部件相关。输入法使用它来检索有关输入法应如何操作的提示。例如,如果设置了ImhFormattedNumbersOnly标志,则输入法可能会更改其可视组件,以反映只能输入数字。 一些小部件需要某些标志才能按预期工作。要设置标志,请执行``w->setInputMethodHints(f) . 设置输入方法提示(w-> 输入方法提示而不是 w->setInputMethodHints(w->inputMethodHints()`设置输入方法提示这些标志只是提示,因此特定的输入法实现可以自由忽略它们。如果要确保输入了特定类型的字符,还应在小部件上设置QValidator。 默认值为ImhNone。 | inputMethodHints() setInputMethodHints(hints) |
isActiveWindow: bool | 此属性保存此小部件的窗口是否是活动窗口。 活动窗口是包含具有键盘焦点的小部件的窗口(如果没有小部件或其小部件均不接受键盘焦点,则窗口可能仍具有焦点)。 当弹出窗口可见时,此属性对于活动窗口和弹出窗口均为true。 默认情况下,此属性为false。 | isActiveWindow() |
layoutDirection: LayoutDirection | 此属性保存此小部件的布局方向。 自Qt 4.7以来,此方法不再影响文本布局方向。 默认情况下,此属性设置为LeftToRight。 在小部件上设置布局方向时,它将传播到小部件的子部件,但不会传播到作为窗口的子部件,也不会传播到为其设置布局方向()的子部件已被明确调用。此外,为父级不继承父级的布局方向,在调用set布局方向()之后添加的子小部件。 | layoutDirection() setLayoutDirection(direction) unsetLayoutDirection() |
locale: PySide6.QtCore.QLocale | 此属性保存小部件的区域设置。 只要没有设置特殊区域设置,这要么是父区域设置,要么是默认区域设置(如果此小部件是顶级小部件)。 如果小部件显示日期或数字,则应使用小部件的区域设置对其进行格式化。 | locale() setLocale(locale) unsetLocale() |
maximized: bool | 此属性保存此小部件是否最大化。 此属性仅与windows相关。 由于某些窗口系统的限制,这并不总是报告预期结果(例如g.,如果X11上的用户通过窗口管理器最大化窗口,则Qt无法将其与任何其他调整大小区分开)。随着窗口管理器协议的发展,这一问题有望得到改善。 默认情况下,此属性为false。 | isMaximized() |
maximumHeight: int | 此属性以像素为单位保存小部件的最大高度。 此属性对应于maximumSize属性所保持的高度。 默认情况下,此属性包含值16777215。 | maximumHeight() setMaximumHeight(maxh) |
maximumSize: PySide6.QtCore.QSize | 此属性保存小部件的最大大小(以像素为单位)。 小部件的大小不能大于最大小部件的大小。 默认情况下,此属性包含宽度和高度的值均为16777215的大小。 | maximumSize() setMaximumSize(maxw,maxh) |
maximumWidth: int | 此属性保存小部件的最大宽度(以像素为单位)。 此属性对应于maximumSize属性保持的宽度。 默认情况下,此属性包含值16777215。 QWIDGETSIZE_MAX宏的定义限制了小部件的最大大小。 | maximumWidth() setMaximumWidth(maxw) |
minimized: bool | 此属性保存此小部件是否被最小化(图标化)。 此属性仅与windows相关。 默认情况下,此属性为false。 | isMinimized() |
minimumHeight: int | 此属性以像素为单位保存小部件的最小高度。 此属性对应于minimumSize属性所保持的高度。 默认情况下,此属性的值为0。 | minimumHeight() setMinimumHeight(minh) |
minimumSize: PySide6.QtCore.QSize | 此属性保存小部件的最小大小。 小部件的大小不能小于最小小部件的大小。如果当前大小较小,则窗口小部件的大小被强制为最小大小。 此函数设置的最小大小将覆盖由q布局定义的最小大小。为了取消设置最小大小,请使用QSize值(0,0)。 默认情况下,此属性包含宽度和高度为零的大小。 | minimumSize() setMinimumSize(arg__1) |
minimumSizeHint: PySide6.QtCore.QSize | 此属性保留小部件的建议最小尺寸。 如果此属性的值为无效大小,则不建议使用最小大小。 如果此小部件没有布局,则minimumSizeHint()的默认实现返回无效大小,否则返回布局的最小大小。大多数内置小部件重新实现minimumSizeHint()。 除非设置了minimumSize()或将大小策略设置为QSizePolicy:: 忽略,否则q布局绝不会将小部件的大小调整为小于最小大小提示的大小。如果设置minimumSize(),则最小大小提示将被忽略。 | minimumSizeHint() |
minimumWidth: int | 此属性保存小部件的最小宽度(以像素为单位)。 此属性对应于minimumSize属性保持的宽度。 默认情况下,此属性的值为0。 | minimumWidth() setMinimumWidth(minw) |
modal: bool | 此属性保存小部件是否是模态小部件。 此属性仅适用于windows。模式小部件可防止所有其他窗口中的小部件获取任何输入。 默认情况下,此属性为false。 | isModal() |
mouseTracking: bool | 此属性保存是否为小部件启用了鼠标跟踪。 如果禁用鼠标跟踪(默认值),则小部件仅在移动鼠标时至少按下一个鼠标按钮时才接收鼠标移动事件。 如果启用了鼠标跟踪,即使没有按下按钮,小部件也会接收鼠标移动事件。 | hasMouseTracking() setMouseTracking(enable) |
normalGeometry: PySide6.QtCore.QRect | 此属性保存小部件的几何形状,当它显示为普通(未最大化或全屏)顶级小部件时将显示。 如果小部件已经处于这种状态,则正常几何图形将反映小部件的当前几何图形()。 对于子小部件,此属性始终包含一个空矩形。 默认情况下,此属性包含一个空矩形。 | normalGeometry() |
palette: PySide6.QtGui.QPalette | 此属性保存小部件的调色板。 此属性描述小部件的调色板。在渲染标准组件时,调色板由小部件的样式使用,并且可以作为一种手段来确保自定义小部件可以保持与本机平台的外观和感觉的一致性。不同的平台或不同的风格有不同的调色板是很常见的。 当您将新调色板分配给小部件时,此调色板中的颜色角色将与小部件的默认调色板组合以形成小部件的最终调色板。小部件的背景角色的调色板条目用于填充小部件的背景(请参阅autofill后台),并且前台角色初始化QPainter的笔。 默认值取决于系统环境。QApplication维护一个系统/主题选项板,作为所有小部件的默认选项。对于某些类型的小部件,也可能有特殊的调色板默认值(例如,在Windows Vista上,从QMenuBar派生的所有类都有一个特殊的默认调色板)。您还可以通过将自定义调色板和小部件的名称传递给setpanel()自己为小部件定义默认调色板。最后,样式始终可以选择按指定的方式抛光调色板(请参阅抛光())。 QWidget将显式调色板角色从父级传播到子级。如果您将画笔或颜色分配给调色板上的特定角色,并将该调色板分配给小部件,则该角色将传播给小部件的所有子部件,覆盖该角色的任何系统默认值。请注意,默认情况下,调色板不会传播到windows(请参阅isWindow()),除非启用了wa_windowcommunications属性。 QWidget的调色板传播类似于其字体传播。 当前样式用于呈现所有标准Qt小部件的内容,可以从小部件调色板中自由选择颜色和画笔,或者在某些情况下,忽略调色板(部分或完全)。特别是,某些样式(如GTK样式、Mac样式和Windows Vista样式)依赖于第三方api来呈现小部件的内容,并且这些样式通常不遵循调色板。因此,不能保证将角色分配给小部件的调色板会改变小部件的外观。相反,您可以选择应用样式表。 请勿将此功能与Qt样式表结合使用。使用样式表时,可以使用"color",“background-color”,“selection-color”,“selection-background-color"and"alternate-background-color”. | palette() setPalette(arg__1) |
pos: PySide6.QtCore.QPoint | 此属性保存小部件在其父小部件中的位置。 如果窗口小部件是窗口,则位置是桌面上小部件的位置,包括其框架。 更改位置时,小部件(如果可见)会立即接收移动事件(moveEvent())。如果小部件当前不可见,则保证在显示之前收到事件。 默认情况下,此属性包含引用原点的位置。 有关windows几何问题的概述,请参阅窗口几何文档。 | pos() move(arg__1) |
rect: PySide6.QtCore.QRect | 此属性保存小部件的内部几何图形,不包括任何窗框。 rect属性等于QRect(0,0,宽度(),高度())。 有关windows几何问题的概述,请参阅窗口几何文档。 默认情况下,此属性包含一个取决于用户平台和屏幕几何图形的值。 | rect() |
size: PySide6.QtCore.QSize | 此属性保存不包括任何窗框的小部件的大小。 如果小部件在调整大小时可见,它将立即收到调整大小事件(resizeEvent())。如果小部件当前不可见,则保证在显示之前收到事件。 如果大小超出minimumSize()和maximumSize()定义的范围,则调整大小。 默认情况下,此属性包含一个取决于用户平台和屏幕几何图形的值。 | size() resize(arg__1) |
sizeHint: PySide6.QtCore.QSize | 此属性保存小部件的建议大小。 如果此属性的值为无效大小,则不建议使用大小。 如果此小部件没有布局,则sizeHint()的默认实现返回无效大小,否则返回布局的首选大小。 | sizeHint() |
sizeIncrement: PySide6.QtCore.QSize | 此属性保存小部件的大小增量。 当用户调整窗口大小时,大小将以sizeIncrement()。宽度()像素水平和sizeIncrement。高度()像素垂直移动,以baseSize()为基础。首选的小部件大小适用于非负整数i和j: width = baseSize().width()+ i * sizeIncrement().width() height = baseSize().height()+ j * sizeIncrement().height() 请注意,虽然您可以为所有小部件设置大小增量,但它只会影响windows。 默认情况下,此属性包含宽度和高度为零的大小。 大小增量在Windows下无效,可能会被x11上的窗口管理器忽略。 | sizeIncrement() setSizeIncrement(arg__1) |
sizePolicy: PySide6.QtWidgets.QSizePolicy | 此属性保存小部件的默认布局行为。 如果有一个QLayout管理此小部件的子级,则使用该布局指定的大小策略。如果没有这样的QLayout,则使用此函数的结果。 默认策略是Preferred/Preferred,这意味着小部件可以自由调整大小,但更喜欢sizeHint()返回的大小。类似按钮的小部件设置大小策略,以指定它们可以水平拉伸,但垂直固定。这同样适用于行编辑控件(如QLineEdit、QSpinBox或可编辑的QComboBox)和其他水平方向的小部件(如QProgressBar)。QToolButton通常是正方形的,因此它们允许双向增长。支持不同方向的小工具(如QSlider、QScrollBar或QHeader)仅指定相应方向的拉伸。可以提供滚动条的小工具(通常是QScrollArea的子类)倾向于指定它们可以使用额外的空间,并且可以使用小于sizeHint()的空间。 | sizePolicy() setSizePolicy(horizontal,vertical) |
statusTip: str | 此属性保存小部件的状态提示。 默认情况下,此属性包含一个空字符串。 | statusTip() setStatusTip(arg__1) |
styleSheet: str | 此属性保存小部件的样式表。 样式表包含小部件样式自定义的文本描述,如Qt样式表文档中所述。 自Qt 4.5以来,Qt样式表完全支持macOS。 | styleSheet() setStyleSheet(styleSheet) |
tabletTracking: bool | 此属性保存是否为小部件启用平板电脑跟踪。 如果禁用平板电脑跟踪(默认设置),则只有当手写笔与平板电脑接触时,或者在移动手写笔时按下至少一个手写笔按钮时,小部件才会接收平板电脑移动事件。 如果启用平板电脑跟踪,即使在附近悬停时,小部件也会接收平板电脑移动事件。这对于监视位置以及旋转和倾斜等辅助财产以及在UI中提供反馈都很有用。 | hasTabletTracking() setTabletTracking(enable) |
toolTip: str | 此属性保存小部件的工具提示。 请注意,默认情况下,工具提示仅显示为活动窗口的子窗口小部件。您可以通过在窗口上而不是在具有工具提示的小部件上设置属性WA_AlwaysShowToolTips来更改此行为。 如果要控制工具提示的行为,可以截获event()函数并捕获tooltip事件(例如,如果要自定义应显示工具提示的区域)。 默认情况下,此属性包含一个空字符串。 | toolTip() setToolTip(arg__1) |
toolTipDuration: int | 此属性保存小部件的工具提示持续时间。 指定工具提示将显示的时间(以毫秒为单位)。如果该值为-1(默认值),则会根据工具提示的长度计算持续时间。 | toolTipDuration() setToolTipDuration(msec) |
updatesEnabled: bool | 此属性保存是否启用更新。 启用更新的小部件接收绘画事件并具有系统背景;禁用的小部件则不会。这也意味着,如果禁用了更新,那么调用update()和repaint()将无效。 默认情况下,此属性为true。 setUpdatesEnabled()通常用于在短时间内禁用更新,例如避免在大的更改过程中出现屏幕闪烁。在Qt中,小部件通常不会产生屏幕闪烁,但在X11中,当小部件被隐藏时,服务器可能会擦除屏幕上的区域,然后再由其他小部件替换。禁用更新可以解决此问题。 例子: setUpdatesEnabled(False) bigVisualChanges() setUpdatesEnabled(True) 禁用小部件会隐式禁用其所有子部件。启用小部件将启用除顶级小部件或已明确禁用的小部件之外的所有子小部件。重新启用更新会隐式调用小部件上的update()。 | updatesEnabled() setUpdatesEnabled(enable) |
visible: bool | 此属性保存小部件是否可见。 如果窗口之前的所有父窗口小部件都可见,则调用setVisible(true)或show()会将小部件设置为可见状态。如果某个祖先不可见,则在显示其所有祖先之前,该小部件不会变为可见。如果它的大小或位置发生了变化,Qt保证小部件在显示之前移动并调整事件大小。如果小部件尚未调整大小,Qt将使用adjustSize()将小部件的大小调整为有用的默认值。 调用setVisible(false)或hide()会显式隐藏小部件。显式隐藏的小部件永远不会变为可见的,即使它的所有祖先都变为可见,除非您显示它。 小部件在其可见性状态更改时接收显示和隐藏事件。在隐藏和显示事件之间,不需要浪费CPU周期来准备或向用户显示信息。例如,视频应用程序可能会简单地停止生成新的帧。 碰巧被屏幕上的其他窗口遮挡的小部件被认为是可见的。这同样适用于图标化的窗口和存在于另一个虚拟桌面上的窗口(在支持这一概念的平台上)。当窗口系统改变其映射状态时,小部件接收自发的显示和隐藏事件,例如,当用户最小化窗口时的自发隐藏事件,以及当窗口再次恢复时的自发显示事件。 您几乎不需要重新实现setVisible()函数。如果您需要在显示小部件之前更改一些设置,请改用showEvent()。如果需要进行一些延迟初始化,请使用传递给event()函数的Polish事件。 | isVisible() setVisible(visible) |
hatsThis: str | 此属性包含小部件的What’s This帮助文本。。 默认情况下,此属性包含一个空字符串。 | whatsThis() setWhatsThis(arg__1) |
width: int | 此属性保留小部件的宽度,不包括任何窗口框架。 有关窗口几何图形问题的概述,请参见"窗口几何图形"文档。 请勿使用此功能在多屏幕桌面上查找屏幕宽度。有关详细信息,请参见Q屏幕。 默认情况下,此属性包含一个值,该值取决于用户的平台和屏幕几何图形。 | |
windowFilePath: str | 此属性保存与小部件关联的文件路径。 此属性仅对窗口有意义。它将文件路径与窗口相关联。如果您设置了文件路径,但没有设置窗口标题,Qt会将窗口标题设置为使用fileName()获得的指定路径的文件名。 如果在任何时候都设置了窗口标题,则窗口标题将优先显示,而不是显示文件路径字符串。 此外,在macOS上,这还有一个额外的好处,即它设置了窗口的代理图标,假设文件路径存在。 如果未设置文件路径,则此属性包含一个空字符串。 默认情况下,此属性包含一个空字符串。 | windowFilePath() setWindowFilePath(filePath) |
windowIcon: PySide6.QtGui.QIcon | 此属性保存小部件的图标。 此属性仅对窗口有意义。如果没有设置图标,windowIcon()将返回应用程序图标(windowIcon)。 在macOS上,窗口图标代表活动文档,除非使用setWindowFilePath设置了文件路径,否则不会显示。 | windowIcon() setWindowIcon(icon) Signal windowIconChanged(icon) |
windowIconText: str | 此属性保存要在最小化窗口的图标上显示的文本。 此属性仅对窗口有意义。如果未设置图标文本,则此访问器将返回一个空字符串。它只在X11平台上实现,并且只有某些窗口管理器使用这个窗口属性。 此属性已弃用。 | windowIconText() setWindowIconText(arg__1) Signal windowIconTextChanged(iconText) |
windowModality: WindowModality | 此属性保存哪些窗口被模式小部件阻止。 此属性仅对窗口有意义。模态小部件可防止其他窗口中的小部件获得输入。此属性的值控制在小部件可见时阻止哪些窗口。在窗口可见时更改此属性没有任何效果;您必须先隐藏()小部件,然后再次显示()。 默认情况下,此属性为NonModal。 | windowModality() setWindowModality(windowModality) |
windowModified: bool | 此属性保留窗口中显示的文档是否有未保存的更改。 修改的窗口是指其内容已更改但尚未保存到磁盘的窗口。此标志将根据平台的不同而产生不同的效果。在macOS上,关闭按钮将具有修改后的外观;在其他平台上,窗口标题将有一个"“(星号)。 窗口标题必须包含一个”[]“占位符,该占位符指示”"应该出现在哪里。通常,它应该出现在文件名之后(例如,"document1.txt[]-文本编辑器")。如果不修改窗口,则只需删除占位符。 请注意,如果一个小部件被设置为已修改,那么它的所有祖先也将被设置为修改。但是,如果在小部件上调用setWindowModified(false),这将不会传播到其父级,因为父级的其他子级可能已被修改。 | isWindowModified() setWindowModified(arg__1) |
windowOpacity: double | 此属性保持窗口的不透明度级别。。 不透明度的有效范围为1.0(完全不透明)到0.0(完全透明)。 默认情况下,此特性的值为1.0。 此功能可在支持Composite扩展的嵌入式Linux、macOS、Windows和X11平台上使用。 在X11上,您需要运行一个复合管理器,并且您正在使用的窗口管理器需要支持X11特定的_NET_WM_WINDOW_OPACITY原子。 将此属性从不透明更改为透明可能会发出绘制事件,该事件需要在窗口正确显示之前进行处理。这主要影响grabWindow()的使用。还要注意,半透明窗口的更新和调整大小明显慢于不透明窗口。 | windowOpacity() setWindowOpacity(level) |
windowTitle: str | 此属性包含窗口标题(标题)。 此属性仅对顶级窗口小部件(如窗口和对话框)有意义。如果没有设置标题,则标题基于windowFilePath。如果这两个都没有设置,那么标题就是一个空字符串。 如果使用windowModified机制,则窗口标题必须包含一个"[]“占位符,该占位符指示”"应该出现在哪里。通常,它应该出现在文件名之后(例如,“document1.txt[*]-文本编辑器”)。如果windowModified属性为false(默认值),则会简单地删除占位符。 在一些桌面平台(包括Windows和Unix)上,如果设置了应用程序名称(来自applicationDisplayName),则会将其添加到窗口标题的末尾。这是由QPA插件完成的,所以它会显示给用户,但不是windowTitle字符串的一部分。 | windowTitle() setWindowTitle(arg__1) Signal windowTitleChanged(title) |
x: int | 此属性保存小部件相对于其父窗口的x坐标,包括任何窗口框架。 有关窗口几何图形问题的概述,请参见"窗口几何图形"文档。 默认情况下,此属性的值为0。 | x() |
y: int | 此属性保存小部件相对于其父窗口的y坐标,包括任何窗口框架。 有关窗口几何图形问题的概述,请参见"窗口几何图形"文档。 默认情况下,此属性的值为0。 | y() |
QWidget常用方法
QWidget的方法及参数类型 | 返回值的类型 | 说 明 |
---|---|---|
[slot]show() | None | 显示窗口,等同于setVisible(True) |
[slot]setHidden(bool) | None | 设置隐藏状态 |
[slot]hide() | None | 隐藏窗口 |
setVisible(bool) | None | 设置窗口是否可见 |
[slot]raise_() | None | 提升控件,放到控件栈的顶部 |
[slot]lower() | None | 降低控件,放到控件栈的底部 |
[slot]close() | bool | 关闭窗口,如果成功则返回 True |
setWindowIcon(QIcon) | None | 设置窗口的图标 |
windowIcon() | QIcon | 获取窗口的图标 |
[slot]setWindowTitle(str) | None | 设置窗口的标题文字 |
windowTitle() | str | 获取窗口标题的文字 |
[slot]setWindowModified(bool) | None | 设置文档是否修改过,可依此在退出程 序时提示保存 |
isWindowModified() | Bool | 获取窗口的内容是否修改过 |
setWindowIconText(str) | None | 设置窗口图标的文字 |
windowIconText() | Str | 获取窗口图标的文字 |
setWindowModality(Qt.WindowModality) | None | 设置窗口的模式特征 |
isModal() | bool | 获取窗口是否有模式特征 |
setWindowOpacity(float) | None | 设置窗口的不透明度;参数值从0到1 |
windowOpacity() | float | 获取窗口的不透明度 |
setWindowState(Qt.WindowState) | None | 设置窗口的状态 |
windowState() | Qt.WindowState | 获取窗口的状态,如最大化状态 |
windowType() | Qt.WindowType | 获取窗口类型 |
activateWindow() | None | 设置成活动窗口,活动窗口可以获得键 盘输入 |
isActiveWindow() | bool | 获取窗口是否是活动窗口 |
setMaximun Width(maxw:int) | None | 设置窗口或控件的最大宽度 |
setMaximumHeight(minh:int) | None | 设置窗口或控件的最大高度 |
setMaximumSize(maxw: int,maxh: int) | None | 设置窗口或控件的最大宽度和高度 |
setMaximumSize(QSize) | None | 设置窗口或控件的最大宽度和高度 |
setMinimumWidth(minw: int) | None | 设置窗口或控件的最小宽度 |
setMinimumHeight(minh:int) | None | 设置窗口或控件的最小高度 |
setMinimumSize(minw:int,minh: int) | None | 设置窗口或控件的最小宽度和高度 |
setMinimumSize(QSize) | None | 设置窗口或控件的最小宽度和高度 |
setFixedHeight(h:int) | None | 设置窗口或控件的固定高度 |
setFixedWidth(w:int) | None | 设置窗口或控件的固定宽度 |
setFixedSize(QSize) | None | 设置窗口或控件的固定宽度和高度 |
setFixedSize(w:int,h: int) | None | 设置窗口或控件的固定宽度和高度 |
[slot]showFullScreen() | None | 全屏显示 |
[slot]showMaximized() | None | 最大化显示 |
[slot]showMinimized() | None | 最小化显示 |
[slot]showNormal() | None | 最大化或最小化显示后回到正常显示 |
isMaximized() | bool | 是否处于最大化状态 |
isMinimized() | bool | 是否处于最小化状态 |
isFullScreen() | bool | 获取窗口是否为全屏状态 |
setAutoFillBackGround(bool) | None | 设置是否自动填充背景 |
autoFillBackground() | bool | 获取是否自动填充背景 |
setObjectName(name:str) | None | 设置窗口或控件的名称 |
setFont(QFont) | None | 设置字体 |
font() | QFont | 获取字体 |
setPalette(QPalette) | None | 设置调色板 |
palette() | QPalette | 获取调色板 |
setUpdatesEnabled(bool) | None | 设置是否可以对窗口进行刷新 |
[slot]update() | None | 刷新窗口 |
uPdate(Union[QRegion,QPolygon,QRect]) | None | 刷新窗口的指定区域 |
uPdate(x:int.y:int.w;int,h:int) | None | 刷新窗口的指定区域 |
setCursor(QCursor) | None | 设置光标 |
cursor() | QCursor | 获取光标 |
unsetCursor() | None | 重置光标,使用父窗口的光标 |
setContextMenuPolicy(policy: Qt.ContextMenuPolicy) | None | 设置右键快捷菜单的弹出策略 |
addAction(action: QAction) | None | 添加动作,以便形成右键快捷菜单 |
addActions(actions: Sequence[QAction]) | None | 添加多个动作 |
insertAction(before: QAction,QAction) | None | 插入动作 |
insertActions(before: QAction,actions: | None | 插入多个动作 |
Sequence[QAction])actions() | List[QAction] | 获取窗口或控件的动作列表 |
[slot]repaint() | None | 调用paintEvent事件重新绘制窗口 |
repaint(x:int,y: int,w:int,h: int) | None | 重新绘制指定区域 |
repaint(Union[QRegion,QPolygon,QRect]) | None | 重新绘制指定区域 |
scroll(dx: int,dy:int) | None | 窗口中的控件向左、向下移动指定的像 素,参数可为负 |
scroll(dx:int,dy:int,QRect) | None | 窗口中指定区域向左、向下移动指定的 像素 |
resize(QSize)、resize(int,int) | None | 重新设置窗口工作区的尺寸 |
size() | QSize | 获取工作区尺寸 |
move(QPoint)、move(x:int,y:int) | None | 移动左上角到指定位置 |
pos() | QPoint | 获取窗口左上角的位置 |
x()、y() | int | 获取窗口左上角的x和y坐标 |
frameGeometry() | QRect | 获取包含标题栏的外框架区域 |
frameSize() | QSize | 获取包含标题栏的外框架的尺寸 |
setGeometry(QRect) | None | 设置工作区的矩形区域 |
setGeometry(x;int,y:int,w: int,h:.int) | None | 设置工作区的矩形区域 |
geometry() | QRect | 获取不包含框架和标题栏的工作区域 |
width()、height() | int | 获取工作区的宽度和高度 |
rect() | QRect | 获取工作区域 |
childrenRect() | QRect | 获取子控件占据的区域 |
baseSize() | QSize | 如果设置了 sizeIncrement属性,获取控 件的合适尺寸 |
setBaseSize(basew:int,baseh:int) | None | 设置控件的合适尺寸 |
setBaseSize(QSize) | None | 设置控件的合适尺寸 |
sizeHint() | QSize | 获取系统推荐的尺寸 |
isVisible() | bool | 获取窗口是否可见 |
[slot]setDisabled(bool) | None | 设置失效状态 |
[slot]setEnabled(bool) | None | 设置是否激活 |
isEnabled() | bool | 获取激活状态 |
isWindow() | bool | 获取是否是独立窗口 |
window() | QWidget | 返回控件所在的独立窗口 |
setToolTip(str) | None | 设置提示信息 |
childAt(QPoint) | QWidget | 获取指定位置处的控件 |
childAt(x:int,y:int) | QWidget | 获取指定位置处的控件 |
setLayout(QLayout) | None | 设置窗口或控件内的布局 |
layout() | QLayout | 获取窗口或控件内的布局 |
setL ayoutDirection(Qt.LayoutDirection) | None | 设置布局的排列方向 |
setParent(parent: QWidget) | None | 设置控件的父窗体 |
setParent(QWidget,f:Qt.WindowFlags) | None | 设置控件的父窗体 |
parentWidget() | QWidget | 获取父窗体 |
[slot]setFocus() | None | 设置获得焦点 |
setSizelncrement(w: int.h: int) | None | 设置窗口变化时的增量值 |
setSizeIncrement(QSize) | None | 设置窗口变化时的增量值 |
sizeIncrement() | QSize | 获取窗口变化时的增量值 |
[slot]setStyleSheet(str) | None | 设置窗口或控件的样式表 |
setMask(QBitmap) | None | 设置遮掩,白色部分不显示,黑色部分 显示 |
setStyle(QStyle) | None | 设置窗口的风格 |
setContentsMargins(left: int,top: int,right: int,bottom:int) | None | 设置左、上、右、下的页边距 |
setContentsMargins(QMargins) | None | 设置左、上、右、下的页边距 |
setAttribute(Qt.WidgetAttribute.on=True) | None | 设置窗口或控件的属性 |
setAcceptDrops(bool) | None | 设置是否接受鼠标的拖放 |
setToolTip(str) | None | 设置提示信息 |
set ToolTipDuration(int) | None | 设置提示信息持续的时间(毫秒) |
setWhats This(str) | None | 设置按ShiftF1键时的提示信息 |
setMouseTracking(enable:bool) | None | 设置是否跟踪鼠标的移动事件 |
hasMouseTracking() | bool | 获取是否有鼠标跟踪事件 |
underMouse() | bool | 获取控件是否处于光标之下 |
setWindowFilePath(str) | None | 在窗口上记录一个路径,例如打开文件 的路径 |
mapFrom(QWidget,QPoint) | QPoint | 将父容器中的点映射成控件坐标系下的点 |
mapFrom(QWidget,QPointF) | QPointF | 将父容器中的点映射成控件坐标系下的点 |
mapFromGlobal(QPoint) | QPoint | 将屏幕坐标系中的点映射成控件的点 |
mapFromGlobal(QPointF) | QPointF | 将屏幕坐标系中的点映射成控件的点 |
mapFromParent(QPoint) | QPoint | 将父容器坐标系下中的点映射成控件的点 |
mapFromParent(QPointF) | QPointF | 将父容器坐标系下中的点映射成控件的点 |
mapTo(QWidget,QPoint) | QPoint | 将控件的点的点映射成父容器坐标系下中 |
mapTo(QWidget,QPointF) | QPointF | 将控件的点的点映射成父容器坐标系下中 |
mapToGlobal(QPoint) | QPoint | 将控件的点映射到屏幕坐标系下的点 |
mapToGlobal(QPointF) | QPointF | 将控件的点映射到屏幕坐标系下的点 |
mapToParent(QPoint) | QPoint | 将控件的点映射到父容器坐标系下的点 |
mapToParent(QPointF) | QPointF | 将控件的点映射到父容器坐标系下的点 |
grab(rectangle: QRect=QRect(0,0,-1,-1)) | QPixmap | 截取控件指定范围的图像,默认为整个控件 |
grabKeyboard() | None | 获取所有的键盘输入事件,其他控件不再接收键盘输入事件 |
releaseKeyboard() | None | 不再获取键盘输人事件 |
grabMouse() | None | 获取所有的鼠标输人事件,其他控件不 再接收鼠标输入事件 |
grabMouse(Union[QCursor,QPixmap]) | None | 获取所有的鼠标输入事件并改变光标形状 |
releaseMouse() | None | 不再获取鼠标输入事件 |
[static]find(int) | QWidget | 根据控件的识别ID号或句柄ID号获取控件 |
[static]keyboardGrabber() | QWidget | 返回键盘获取的控件 |
[static]mouseGrabber() | QWidget | 返回鼠标获取的控件 |
[static]setTabOrder(QWidget,QWidget) | None | 设置窗口上的控件的Tab键顺序 |
-
窗口的显示与关闭。
-
用show()方法可以显示窗口,用hide()方法可以隐藏窗口
-
也可以用setVisible(bool)方法和 setHidden(bool)方法设置窗口的可见性,
-
用isVisible()和 isHidden()方法判断窗口是否可见
-
用close()方法可以关闭窗口。当窗口被关闭时
- 首先向这个窗口发送一个关闭事件closeEvent(event:QCloseEvent),如果事件被接受,则窗口被隐藏;
- 如果事件被拒绝,则什么也不做。
-
如果创建窗口时用setAttribute(Qt.WA_QuitOnClose,on=True)方法设置了Qt.WA_QuitOnClose属性,则窗口对象会被析构(删除),大多数类型的窗口都默认设置了这个属性。
-
close()方法的返回值bool表示关闭事件是否被接受,也就是窗口是否真的被关闭了。
-
-
窗口的提升与降级。如果显示多个窗口,则窗口之间是有先后顺序的,用raise_()方法可把窗口放到前部,用lower()方法可以把窗口放到底部。
-
窗口的状态。独立窗口有正常、全屏、最大化、最小化几种状态
-
用isMinimized()方法判断窗口是否为最小化,
-
用isMaximized()方法判断窗口是否为最大化,
-
用isFullScreen()方法 判断窗口是否为全屏,
-
用showMinimized()方法设置以最小化方式显示窗口,
-
用showMaximized()方法设置以最大化方式显示窗口,
-
用showFullScreen()方法设置以全屏方式显示窗口,
-
用showNormal()方法设置以正常方式显示窗口。
-
另外用setWindowState(Qt.WindowStates)方法也可以设置窗口的状态,其中参数Qt.WindowStates 可以取:
- Qt.WindowNoState(无标识,正常状态)
- Qt.WindowMinimized(最小化状态)
- Qt.WindowMaxmized(最大化状态)
- Qt.WindowFullScreen(全屏状态)
- Qt.WindowActive(激活状态);
-
用windowState()方法可以获取状态。
-
-
窗口的几何参数。QWidget如果作为独立窗口,则有标题栏、框架和工作区;如果作为控件,则没有标题栏。
- QWidget 提供了设置和获取窗口与工作区尺寸的方法。
- 窗口尺寸的设置是在屏幕坐标系下进行的,屏幕坐标系的原点在左上角,向右表示x方向,向下表示y方向。
- 窗口几何参数的意义如图所示,用x()、y()和pos()方法可以获得窗口左上角的坐标,
- 用frameGeometry()方法可以获得窗口框架的几何参数,用frameSize()方法可以获得框架的宽度和高度,
- 用geometry()方法可以获得工作区的几何参数,包括左上角的位置和宽度、高度,
- 用rect()、size(),width()和height()方法可以获得工作区的宽度、高度。
- 用move(int:x,int:y)方法可以将窗口左上角移动到坐标(x,y)处,
- 用move(QPoint)方法可以将窗口左上角移动到QPoint处,
- 用resize(w:int,h:int)方法可以设置工作区的宽度和高度,
- 用resize(QSize)方法可以将工作区宽度和高度设置成QSize,
- 用setGeometry(x:int,y:int,w:int,h:int)方法可以将工作区的左上角移动到(x,y)处,宽度改为w,高度改为h。
- QWidget 提供了设置和获取窗口与工作区尺寸的方法。
-
焦点。焦点用来控制同一个独立窗口内哪一个控件可以接受键盘事件,同一时刻只能有一个控件获得焦点。
- 用setFocus()方法可以使一个控件获得焦点,
- 用clearFocus()方法可以使控件失去焦点,
- 用hasFocus()方法可以获取控件是否有焦点。
-
活跃,当有多个独立窗口同时存在时,只有一个窗口能够处于活跃状态。系统产生的键盘、鼠标等输入事件将被发送给处于活跃状态的窗口。一般来说,这样的窗口会被提升到堆叠层次的最上面,除非其他窗口有总在最上面的属性。
- 用activateWindow()方法可以使窗口活跃,
- 用isActiveWindow()方法可以查询窗口是否活跃。
-
激活。处于激活状态的窗口才有可能处理键盘和鼠标等输入事件;反之,处于禁用状态的窗口不能处理这些事件。
- 用setEnabled(bool)方法或 setDisabled(bool)方法可以使窗口激活或失效
- 用isEnabled()方法可以查询窗口是否处于激活状态。
-
窗口标题和图标。
- 用setWindowTitle(str)方法可以设置窗口的标题文字,
- 用setWindowIcon(QIcon)方法可以设置窗口的图标,
- 用setWindowIconText(str)方法可以设置图标的文字,
- 用windowTitle()方法和 windowIcon()方法可以获取窗口的标题文字和图标。
-
字体和调色板。
- 用setFont(QFont)和 setPalette(QPalette)方法可以设置窗口的字体和调色板,
- 用font()和 palette()方法可以获取字体和调色板。
-
窗口的布局。
-
用setLayout(QLayout)方法可以设置窗口的布局,
-
用layout()方法可以获取窗口的布局
-
用setLayoutDirection(Qt.LayoutDirection)方法可以设置布局的方向,其中参数Qt.LayoutDirection 可以取:
PySide6.QtCore.Qt.LayoutDirection 指定Qt布局和文本处理的方向。
Constant Description Qt.LeftToRight 从左到右的布局。 Qt.RightToLeft 从右到左的布局。 Qt.LayoutDirectionAuto 自动布局。
-
-
光标。
- 用setCursor(QCursor)方法可以为窗口或控件设置光标,
- 用cursor()方法可以获取光标,
- 用unsetCursor()方法可以重置光标,重置后的光标使用父窗口的光标。
-
父窗口。
- 用setParent(QWidget)方法可以设置控件的父窗口或容器,
- 用parentWidget()方法可以获取父窗口或容器。
-
窗口属性。
-
用setAttribute(Qt.WidgetAttribute,on=True)方法可以设置窗口的属性,
-
用testAttribute(Qt.WidgetAttribute)方法可以测试是否设置了某个属性,其中参数Qt.WidgetAttribute的常用取值如表:
Qt.WidgetAttribute的取值 说 明 Qt.WA_DeleteOnClose 调用close()方法时删除窗口而不是隐藏窗口 Qt.WA_QuitOnClose 最后一个窗口如果有Qt.WA_DeleteOnClose 属性,则执行 close()方法时退出程序 Qt.WA_AcceptDrops 接受鼠标拖放的数据 Qt.WA_AlwaysShowToolTips 窗口失效时也显示提示信息 Qt.WA_Disabled 窗口处于失效状态,不接收键盘和鼠标的输入 Qt.WA_DontShowOnScreen 窗口隐藏 Qt.WA_ForceDisabled 即使父窗口处于激活状态,窗口也强制失效 Qt.WA_TransparentForMouseEvents 窗口和其子窗口忽略鼠标事件 Qt.WA_RightToLeft 布局方向从右向左 Qt.WA_ Show WithoutActivating 当不激活窗口时,显示窗口
-
-
右键快捷菜单的弹出策略。在窗口或控件上右击鼠标时,将弹出右键快捷菜单(上下文菜单)
-
用setContextMenuPolicy(policy: PySide6.QtCore.Qt.ContextMenuPolicy)方法设置弹出快捷菜单的策略和处理方式,其中 policy 是 Qt.ContextMenuPolicy的枚举值:
Qt.ContextMenuPolicy的取值 值 说 明 Qt.NoContextMenu 0 控件没有自己特有的快捷菜单,使用控件父窗口或父容器 的快捷菜单 Qt.DefaultContextMenu 1 鼠标右键事件交给控件的contextMenuEvent()函数处理 Qt.ActionsContextMenu 2 右键快捷菜单是控件或窗口的actions()方法获取的动作 Qt.CustomContextMenu 3 用户自定义快捷菜单,右击鼠标时,发射 customContextMenuRequested(QPoint)信号,其中 QPoint 是鼠标右击时光标的位置 Qt.PreventContextMenu 4 鼠标右键事件交给控件的mousePressEvent()和 mouseReleaseEvent()函数进行处理 -
policy 取 Qt.DefaultContextMenu 或 Qt.PreventContextMenu时,鼠标右击事件交给控件的事件处理函数进行处理,有关事件处理方面的内容详见事件处理章节;
-
policy 取 Qt.CustomContextMenu 时,右击鼠标时会发射customContextMenuRequested(QPoint)信号,此时用户可以在槽函数中编写菜单,用菜单的popup(pos:QPoint)方法弹出菜单,pos是菜单的弹出位置,有关菜单的内容见3.2节,policy 取Qt.ActionsContextMenu时,快捷菜单由窗口或控件的动作构成,有关动作的内容菜单节
-
用窗口或控件的addAction(action:QAction)或addActions(actions: Sequence[QAction])方法可以添加动作,
-
用insertAction(before: QAction,action: QAction)或 insertActions(before: QAction.actions:Sequence[QAction])方法可以插入动作,用actions()方法获取动作列表。
-
信号
信号 | 说明 |
---|---|
customContextMenuRequested(pos:PySide6.QtCore.QPoint) | 当小部件的contextMenuPolicy为CustomContextMenu,并且用户请求了小部件上的上下文菜单时,会发出此信号。位置pos是小部件接收的上下文菜单事件的位置。通常这是在小部件坐标中。此规则的例外是QAbstractScrollArea及其子类,它们将上下文菜单事件映射到viewport()的坐标。 通过setContextMenuPolicy(Qt.CustomContextMenu)方法设 置快捷菜单是自定义菜单,此时右击鼠标时发送信号,参数是 右击鼠标时光标的位置 |
windowIconChanged(icon:PySide6.QtGui.QIcon) | 此信号是在窗口的图标发生更改时发出的,并以新图标作为参数。 属性windowIcon的通知信号。 |
windowIconTextChanged(iconText:str) | 此信号是在窗口的图标文本发生更改时发出的,并以新的图标文本作为参数。 此信号已弃用。 属性窗口IconText的通知信号。 |
windowTitleChanged(title:str) | 当窗口的标题发生更改时,会发出此信号,并将新标题作为参数。 属性windowTitle的通知信号。 |
顶层窗口样式设置
窗口控件的创建和样式设置
创建窗口
__init__(self,parent=None,flags)
创建控件的时候,设置父控件,以及标志位,调整整个应用程序窗口外观
- parent 父控件,没有父控件的控件,即顶层控件,控件 一般指非窗口控件
- flags 标志位,创建时直接传入
type: PySide6.QtCore.Qt.WindowType
即可见下面窗口外观标志表
创建窗口后设置窗口标志
不同于直接创建窗口时传入标志后面设置样式,创建后设置和创建时设置窗口WindowType效果一样
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QWidget
win=QWidget(parent=None,f=Qt.WindowType.Widget)
win.setWindowFlags(Qt.WindowType.Dialog)
方法 | 说明 |
---|---|
window.setWindowFlags(type: PySide6.QtCore.Qt.WindowType) | 设置窗口样式,WindowType见标志表 |
setWindowFlag(arg__1: PySide6.QtCore.Qt.WindowType,on: bool = True) | 设置窗口样式开关 |
windowFlags() | 获取当前窗口标志 |
窗口类型Qt.WindowType
窗口类型的取值 | 说明 |
---|---|
Qt.Widget | 这是 QWidget 的默认类型。此类型的小部件是子窗口(如果有父小部件)和独立窗口(如果它们没有父窗口)。有最小最大和关闭按钮 |
Qt.Window | 指示小组件是一个窗口,通常具有窗口系统框架和标题栏,而不管小组件是否具有父窗口。请注意,如果小部件没有父项,则无法取消设置此标志。 |
Qt.Dialog | 对话框窗口在标题栏上通常 没有最大化按钮和最小化按钮,如果是从其他窗口中弹出了对话框窗口,可 以通过 setWindowModality()方法将其设置成模式窗口。在关闭模式窗口之前,不允许对其他窗口进行操作。 有问号和关闭 |
Qt.Sheet | 指示窗口是 macOS 上的工作表。由于使用工作表意味着窗口模态,因此推荐的方法是使用 QWidget::setWindowModality()或 QDialog::open()。 |
Qt.Drawer | 指示小组件是 macOS 上的抽屉。此功能已过时。设置标志不起作用。 |
Qt.Popup | 弹出式顶层窗口,这个窗口是带模式的,常用来做弹出式菜单 |
Qt.Tool | QWidget 是一个工具窗,工具窗通常有比正常窗口小的标题栏,可以在其上面放置按钮。 如果有父项,则工具窗口将始终保留在其顶部。如果没有父级,也可以考虑使用 WindowStaysOnTopHint。 如果窗口系统支持它,则可以使用稍浅的框架来装饰工具窗口。它也可以与FramelessWindowHint结合使用。 在 macOS 上,工具窗口对应于 NSPanel 类的窗口。这意味着窗口位于高于正常窗口的水平上,因此无法在其上放置普通窗口。默认情况下,当应用程序处于非活动状态时,工具窗口将消失。这可以通过WA_MacAlwaysShowToolWindow 属性进行控制。 |
Qt.ToolTip | 指示小组件是工具提示。这在内部用于实现工具提示。没有标题栏和边框 |
Qt.SplashScreen | 指示窗口是初始屏幕欢迎窗。这是 QSplashScreen 的默认类型。闪屏,无边框无任务栏 |
Qt.Desktop | QWidget是个桌面,这是QDesktopWidget的默认值 |
Qt.SubWindow | 指示此小组件是子窗口,如 QMdiSubWindow 小组件。无按钮有标题 |
Qt.ForeignWindow | 指示此窗口对象是一个句柄,表示由另一个进程或使用本机代码手动创建的本机平台窗口。发现设置这个可以实现完全隐藏 |
Qt.CoverWindow | 指示窗口表示封面窗口,在某些平台上最小化应用程序时显示该窗口。 |
影响窗口外观的Qt.WindowType的取值
Qt.WindowType的取值 | 说 明 |
---|---|
Qt.MSWindowsFixedSizeDialogHint | 在窗口上为窗口提供细对话框边框。此样式使得大小不可调整。 不建议在多显示器环境中使用此标志。因为系统将强制窗口在跨屏幕移动时保持其本机大小。当使用具有不同分辨率的显示器时,这尤其不可取。 |
Qt.MSWindowsOwnDC | 在 Windows 上为窗口提供自己的显示上下文。 |
Qt.BypassWindowManagerHint | 完全忽视窗口管理器,它的作用是产生一个根本不被管理的无窗口边框的窗口(此时,用户无法使用键盘进行输入,除非手动调用QWidget::activateWindow()函数)。窗口不受窗口管理协议的约束,与具体的操作系统有关 |
Qt.X11BypassWindowManagerHint | 无边框窗口,不受任务管理器的管理。如果不是用activateWindow()方法激活,不接受键盘输人 |
Qt.FramelessWindowHint | 无边框和标题栏窗口,无法移动和改变窗口的尺寸 |
Qt.NoDropShadowWindowHint | 不支持拖放操作的窗口 |
Qt.CustomizeWindowHint | 自定义窗口,不显示窗口的默认提示信息,以下可选值可配合该值一起使用. 这个参数相比FramelessWindowHint顶部会多显示一部分 |
Qt.WindowTitleHint | 有标题栏的窗口 |
Qt.WindowSystemMenuHint | 为窗口添加一个窗口系统系统菜单,并尽可能地添加一个关闭按钮。 |
Qt.WindowMinimizeButtonHint | 有最小化按钮的窗口 |
Qt.WindowMaximizeButtonHint | 有最大化按钮的窗口 |
Qt.WindowMinMaxButtonsHint | 有最小化和最大化按钮的窗口 |
Qt.WindowCloseButtonHint | 有关闭按钮的窗口 |
Qt.WindowContextHelpButtonHint | 有帮助按钮的窗口 |
Qt.MacWindowToolBarButtonHint | 在 Mac 系统中,添加工具栏按钮 |
Qt.WindowFullscreenButtonHint | 有全屏按钮的窗口 |
Qt.WindowShadeButtonHint | 在最小化按钮处添加背景按钮 |
Qt.WindowStaysOnTopHint | 始终在最前面的窗口,窗口置顶 |
Qt.WindowStaysOnbottomHint | 始终在最后面的窗口 |
Qt.WindowTransparentForInput | 只用于输出,不能用于输入的窗口 |
Qt.WindowDoesnotAcceptFocus | 不接受输入焦点的窗口 |
Qt.MaximizeUsingFullscreenGeometryHint | 通知窗口系统在最大化窗口时应尽可能多地使用可用的屏幕几何空间,包括可能被UI覆盖的区域(例如状态栏或应用程序启动器)。这可能会导致窗口被置于这些系统UI之下,具体情况取决于平台是否支持。启用该标志后,用户负责将 QScreen.availableGeometry()也考虑在内,以便应用程序中需要用户交互的任何UI元素都不会被系统UI覆盖。 不同于showFullScreen方法 |
下面举一个有关窗口类型的实例
import sys
from typing import Type
from PySide6 import QtCore,QtWidgets
from PySide6.QtCore import Qt
"""
本案例为 Qt 官方案例 Window Flags Example 的 PySide6 移植版
https://doc.qt.io/qt-6/qtwidgets-widgets-windowflags-example.html
用于展示在不同的 Window Flags 标记下,顶层窗口的样式状态
https://doc.qt.io/qt-6/qt.html#WindowType-enum
"""
class ControllerWindow(QtWidgets.QWidget):
"""控制窗口类"""
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.preview_window = PreviewWindow()# 创建预览窗口
self.create_type_groupbox()
self.create_hints_groupbox()
quit_button = QtWidgets.QPushButton("Quit")
quit_button.clicked.connect(QtCore.QCoreApplication.quit)# type: ignore
bottom_layout = QtWidgets.QHBoxLayout()
bottom_layout.addStretch()
bottom_layout.addWidget(quit_button)
main_layout = QtWidgets.QVBoxLayout()
main_layout.addWidget(self.type_groupbox)
main_layout.addWidget(self.hints_group_box)
main_layout.addLayout(bottom_layout)
self.setLayout(main_layout)
self.setWindowTitle("Window Flags")
self.update_preview()
def create_type_groupbox(self)-> None:
"""
创建type单选按钮,并布局到组框中
:return: None
"""
self.type_groupbox = QtWidgets.QGroupBox("Type")
self.window_radiobutton = self.crate_radiobutton("Window")
self.dialog_radiobutton = self.crate_radiobutton("Dialog")
self.sheet_radiobutton = self.crate_radiobutton("Sheet")
self.popup_radiobutton = self.crate_radiobutton("Popup")
self.tool_radiobutton = self.crate_radiobutton("Tool")
self.tool_tip_radiobutton = self.crate_radiobutton("Tooltip")
self.splash_screen_radiobutton = self.crate_radiobutton("Splashscreen")
self.sub_window_radiobutton = self.crate_radiobutton("Subwindow")
self.foreign_window_radiobutton = self.crate_radiobutton("Foreignwindow")
self.cover_window_radiobutton = self.crate_radiobutton("Coverwindow")
self.window_radiobutton.setChecked(True)
layout = QtWidgets.QGridLayout()
layout.addWidget(self.window_radiobutton,0,0)
layout.addWidget(self.dialog_radiobutton,1,0)
layout.addWidget(self.sheet_radiobutton,2,0)
layout.addWidget(self.popup_radiobutton,3,0)
layout.addWidget(self.tool_radiobutton,4,0)
layout.addWidget(self.tool_tip_radiobutton,0,1)
layout.addWidget(self.splash_screen_radiobutton,1,1)
layout.addWidget(self.sub_window_radiobutton,2,1)
layout.addWidget(self.foreign_window_radiobutton,3,1)
layout.addWidget(self.cover_window_radiobutton,4,1)
self.type_groupbox.setLayout(layout)
def create_hints_groupbox(self)-> None:
"""
创建hints复选框,并布局到组框中
:return: None
"""
self.hints_group_box = QtWidgets.QGroupBox("Hints")
self.ms_windows_fixed_size_dialog_checkbox = self.create_checkbox("MS窗口固定大小对话框")
self.bypass_window_manager_checkbox = self.create_checkbox("!!绕过窗口管理器")
self.x11_bypass_window_manager_checkbox = self.create_checkbox("!!X11绕过窗口管理器")
self.frameless_window_check_box = self.create_checkbox("无框窗口")
self.window_no_shadow_check_box = self.create_checkbox("无阴影")
self.window_title_check_box = self.create_checkbox("标题")
self.window_system_menu_check_box = self.create_checkbox("菜单")
self.window_minimize_button_check_box = self.create_checkbox("最小化按钮")
self.window_maximize_button_check_box = self.create_checkbox("最大化按钮")
self.window_close_button_check_box = self.create_checkbox("关闭按钮")
self.window_context_help_button_check_box = self.create_checkbox("上下文帮助按钮")
self.window_shade_button_check_box = self.create_checkbox("窗帘按钮")
self.window_stays_on_top_check_box = self.create_checkbox("保持在顶部")
self.window_stays_on_bottom_check_box = self.create_checkbox("停留在底部")
self.customize_window_hint_check_box = self.create_checkbox("自定义窗口")
self.window_transparent_for_input_check_box = self.create_checkbox("窗口透明")
self.ms_windows_own_dc_check_box = self.create_checkbox("微软视窗自己的DC")
self.max_using_full_screen_hint_check_box = self.create_checkbox("使用全屏最大化")
layout = QtWidgets.QGridLayout()
layout.addWidget(self.ms_windows_fixed_size_dialog_checkbox,0,0)
layout.addWidget(self.ms_windows_own_dc_check_box,1,0)
layout.addWidget(self.bypass_window_manager_checkbox,2,0)
layout.addWidget(self.x11_bypass_window_manager_checkbox,3,0)
layout.addWidget(self.frameless_window_check_box,4,0)
layout.addWidget(self.window_no_shadow_check_box,5,0)
layout.addWidget(self.customize_window_hint_check_box,6,0)
layout.addWidget(self.window_title_check_box,7,0)
layout.addWidget(self.window_system_menu_check_box,8,0)
layout.addWidget(self.window_minimize_button_check_box,0,1)
layout.addWidget(self.window_maximize_button_check_box,1,1)
layout.addWidget(self.window_close_button_check_box,2,1)
layout.addWidget(self.window_context_help_button_check_box,3,1)
layout.addWidget(self.window_stays_on_top_check_box,4,1)
layout.addWidget(self.window_shade_button_check_box,5,1)
layout.addWidget(self.window_stays_on_bottom_check_box,6,1)
layout.addWidget(self.window_transparent_for_input_check_box,7,1)
layout.addWidget(self.max_using_full_screen_hint_check_box,8,1)
self.hints_group_box.setLayout(layout)
def update_preview(self)-> None:
"""
为preview窗口设置新的flags并重新显示
:return: None
"""
# flags: Type[Qt.WindowType] = Qt.WindowFlags
if self.window_radiobutton.isChecked():
flags = Qt.WindowType.Window
elif self.dialog_radiobutton.isChecked():
flags = Qt.WindowType.Dialog
elif self.sheet_radiobutton.isChecked():
flags = Qt.WindowType.Sheet
elif self.popup_radiobutton.isChecked():
flags = Qt.WindowType.Popup
elif self.tool_radiobutton.isChecked():
flags = Qt.WindowType.Tool
elif self.tool_tip_radiobutton.isChecked():
flags = Qt.WindowType.ToolTip
elif self.splash_screen_radiobutton.isChecked():
flags = Qt.WindowType.SplashScreen
elif self.sub_window_radiobutton.isChecked():
flags = Qt.WindowType.SubWindow
elif self.foreign_window_radiobutton.isChecked():
flags = Qt.WindowType.ForeignWindow
elif self.cover_window_radiobutton.isChecked():
flags = Qt.WindowType.CoverWindow
if self.ms_windows_fixed_size_dialog_checkbox.isChecked():
flags |= Qt.WindowType.MSWindowsFixedSizeDialogHint
if self.bypass_window_manager_checkbox.isChecked():
flags |= Qt.WindowType.BypassWindowManagerHint
if self.x11_bypass_window_manager_checkbox.isChecked():
flags |= Qt.WindowType.X11BypassWindowManagerHint
if self.frameless_window_check_box.isChecked():
flags |= Qt.WindowType.FramelessWindowHint
if self.window_no_shadow_check_box.isChecked():
flags |= Qt.WindowType.NoDropShadowWindowHint
if self.window_title_check_box.isChecked():
flags |= Qt.WindowType.WindowTitleHint
if self.window_system_menu_check_box.isChecked():
flags |= Qt.WindowType.WindowSystemMenuHint
if self.window_minimize_button_check_box.isChecked():
flags |= Qt.WindowType.WindowMinimizeButtonHint
if self.window_maximize_button_check_box.isChecked():
flags |= Qt.WindowType.WindowMaximizeButtonHint
if self.window_close_button_check_box.isChecked():
flags |= Qt.WindowType.WindowCloseButtonHint
if self.window_context_help_button_check_box.isChecked():
flags |= Qt.WindowType.WindowContextHelpButtonHint
if self.window_shade_button_check_box.isChecked():
flags |= Qt.WindowType.WindowShadeButtonHint
if self.window_stays_on_top_check_box.isChecked():
flags |= Qt.WindowType.WindowStaysOnTopHint
if self.window_stays_on_bottom_check_box.isChecked():
flags |= Qt.WindowType.WindowStaysOnBottomHint
if self.customize_window_hint_check_box.isChecked():
flags |= Qt.WindowType.CustomizeWindowHint
if self.window_transparent_for_input_check_box.isChecked():
flags |= Qt.WindowType.WindowTransparentForInput
if self.ms_windows_own_dc_check_box.isChecked():
flags |= Qt.WindowType.MSWindowsOwnDC
if self.max_using_full_screen_hint_check_box.isChecked():
flags |= Qt.WindowType.MaximizeUsingFullscreenGeometryHint
self.preview_window.set_window_flags(flags)
# 防止某些平台下窗口出现在不可见的位置
pos = self.preview_window.pos()
if pos.x()< 0:
pos.setX(0)
if pos.y()< 0:
pos.setY(0)
self.preview_window.move(pos)
self.preview_window.show()# 重新显示preview窗口
def crate_radiobutton(self,text: str)-> QtWidgets.QRadioButton:
"""
快速创建单选按钮并连接clicked信号至self.update_preview槽函数
:param text: 单选按钮的文字
:return: 创建的单选按钮
"""
button = QtWidgets.QRadioButton(text)
button.clicked.connect(self.update_preview)# type: ignore
return button
def create_checkbox(self,text: str)-> QtWidgets.QCheckBox:
"""
快速创建复选框并连接clicked信号至self.update_preview槽函数
:param text: 复选框的文字
:return: 创建的复选框
"""
checkbox = QtWidgets.QCheckBox(text)
checkbox.clicked.connect(self.update_preview)# type: ignore
return checkbox
class PreviewWindow(QtWidgets.QWidget):
"""预览窗口类"""
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
# 创建一个只读的文本编辑器,用于显示当前窗口状态
self.text_edit = QtWidgets.QTextEdit()
self.text_edit.setReadOnly(True)
self.text_edit.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)
self.close_button = QtWidgets.QPushButton("&Close")
self.close_button.clicked.connect(self.close)# type: ignore
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.text_edit)
layout.addWidget(self.close_button)
self.setLayout(layout)
self.setWindowTitle("Preview")
def set_window_flags(self,flags: Qt.WindowFlags)-> None:
"""
设置窗口标志并显示到文本编辑器中
:param flags: 窗口标记
:return: None
"""
self.setWindowFlags(flags)
text =""# 用于在窗口显示的提示文本
window_type = flags & Qt.WindowType_Mask
# 设置窗口类型的提示文本
if window_type == Qt.Window:
text ="Qt.Window"
elif window_type == Qt.Dialog:
text ="Qt.Dialog"
elif window_type == Qt.Sheet:
text ="Qt.Sheet"
elif window_type == Qt.Drawer:
text ="Qt.Drawer"
elif window_type == Qt.Popup:
text ="Qt.Popup"
elif window_type == Qt.Tool:
text ="Qt.Tool"
elif window_type == Qt.ToolTip:
text ="Qt.ToolTip"
elif window_type == Qt.SplashScreen:
text ="Qt.SplashScreen"
elif window_type == Qt.SubWindow:
text ="Qt.SubWindow"
elif window_type == Qt.ForeignWindow:
text ="Qt.ForeignWindow"
elif window_type == Qt.CoverWindow:
text ="Qt.CoverWindow"
# 设置窗口标志的提示文本
if flags & Qt.MSWindowsFixedSizeDialogHint:
text +="\n| Qt.MSWindowsFixedSizeDialogHint"
if flags & Qt.BypassWindowManagerHint:
text +="\n| Qt.BypassWindowManagerHint"
if flags & Qt.X11BypassWindowManagerHint:
text +="\n| Qt.X11BypassWindowManagerHint"
if flags & Qt.FramelessWindowHint:
text +="\n| Qt.FramelessWindowHint"
if flags & Qt.NoDropShadowWindowHint:
text +="\n| Qt.NoDropShadowWindowHint"
if flags & Qt.WindowTitleHint:
text +="\n| Qt.WindowTitleHint"
if flags & Qt.WindowSystemMenuHint:
text +="\n| Qt.WindowSystemMenuHint"
if flags & Qt.WindowMinimizeButtonHint:
text +="\n| Qt.WindowMinimizeButtonHint"
if flags & Qt.WindowMaximizeButtonHint:
text +="\n| Qt.WindowMaximizeButtonHint"
if flags & Qt.WindowCloseButtonHint:
text +="\n| Qt.WindowCloseButtonHint"
if flags & Qt.WindowContextHelpButtonHint:
text +="\n| Qt.WindowContextHelpButtonHint"
if flags & Qt.WindowShadeButtonHint:
text +="\n| Qt.WindowShadeButtonHint"
if flags & Qt.WindowStaysOnTopHint:
text +="\n| Qt.WindowStaysOnTopHint"
if flags & Qt.WindowStaysOnBottomHint:
text +="\n| Qt.WindowStaysOnBottomHint"
if flags & Qt.CustomizeWindowHint:
text +="\n| Qt.CustomizeWindowHint"
if flags & Qt.WindowTransparentForInput:
text +="\n| Qt.WindowTransparentForInput"
if flags & Qt.MSWindowsOwnDC:
text +="\n| Qt.MSWindowsOwnDC"
if flags & Qt.MaximizeUsingFullscreenGeometryHint:
text +="\n| Qt.MaximizeUsingFullscreenGeometryHint"
self.text_edit.setPlainText(text)
if __name__ =="__main__":
app = QtWidgets.QApplication(sys.argv)
window = ControllerWindow()
window.show()
sys.exit(app.exec())
窗口图标
方法 | 说明 |
---|---|
setWindowIcon(QIcon(“resource/header_icon.png”)) | 设置窗口图标 |
windowIcon() | 获取窗口图标 |
窗口标题
方法 | 说明 |
---|---|
setWindowTitle(“title”) | 设置窗口标题 |
windowTitle() | 获取窗口标题 |
窗口不透明度
方法 | 说明 |
---|---|
setWindowOpacity(level) | 设置窗口不透明度,level限制0-1,1为完全不透明 |
windowOpacity() | 获取窗口不透明度 |
窗口状态
方法 | 说明 |
---|---|
setWindowState(self,state: PySide6.QtCore.Qt.WindowState)-> None | 设置窗口状态 WindowState 可为状态值对象表 |
windowState() | 获取窗口状态 |
状态值对象表
值 | 说明 |
---|---|
Qt.WindowNoState | 无状态(默认) |
Qt.WindowMinimized | 最小化 |
Qt.WindowMaximized | 最大化 |
Qt.WindowFullScreen | 全屏,不显示任务栏标题栏等全屏显示(慎用最好配好相关快捷键切换其他状态) |
Qt.WindowActive | 活动窗口 |
最大化最小化
控制
方法 | 说明 |
---|---|
showFullScreen() | 全屏显示 不包含窗口框架 |
showMaximized() | 最大化 包括窗口框架 |
showMinimized() | 最小化 |
showNormal() | 正常 |
判定
方法 | 说明 |
---|---|
isMinimized() | 是否是最小化窗口 |
isMaximized() | 是否是最大化窗口 |
isFullScreen() | 是否全屏 |
大小位置
方法 | 说明 |
---|---|
x() | 相对于父控件的x位置,包含窗口框架。顶层控件(没有父控件)则相对于桌面的x位置 |
y() | 相对于父控件的y位置,包含窗口框架。顶层控件(没有父控件)则相对于桌面的y位置 |
pos() | x和y的组合,包含窗口框架返回QPoint(x,y) |
width() | 控件的宽度,不包含任何窗口框架 |
height() | 控件的高度,不包含任何窗口框架 |
size() | width和height的组合,不包含任何窗口框架,QSize(width,height) |
geometry() | 用户区域相对于父控件的位置和尺寸组合,QRect(x,y,width,height) |
rect() | 0,0,width,height的组合,QRect(0,0,width,height) |
frameSize() | 框架大小 |
frameGeometry() | 框架尺寸 |
minimumWidth() | 最小尺寸的宽度 |
minimumHeight() | 最小尺寸的高度 |
minimumSize() | 最小尺寸 |
maximumWidth() | 最大尺寸的宽度 |
maximumHeight() | 最大尺寸的高度 |
maximumSize() | 最大尺寸 |
move(x,y) | 操控的是x,y;也就是pos包括窗口框架 |
resize(width,height) | 操控的是宽高 不包括窗口框架 |
setGeometry(x_noFrame,y_noFrame,width,height) | 注意,此处参照为用户区域 |
adjustSize() | 根据内容自适应大小 |
setFixedSize() | 设置固定尺寸 |
setMaximumWidth() | 设置最大宽度 |
setMaximumHeight() | 设置最大高度 |
setMaximumSize() | 设置最大尺寸 |
setMinimumWidth() | 设置最小宽度 |
setMinimumHeight() | 设置最小高度 |
setMinimumSize() | 设置最小尺寸 |
注意: 控件显示完毕之后,具体的位置或者尺寸数据才会正确
内容边距
调整控件内容边距,使得显示更自然
方法 | 说明 |
---|---|
setContentsMargins(左,上,右,下) | 设置内容边距 |
getContentsMargins() | 获取内容边距,返回(左,上,右,下) |
contentsRect() | 获取内容区域 |
必须是控件本身留够对应的大小
控件区域鼠标形状
- 设置鼠标形状:
setCursor(sizexxCursor)
- 重置形状,恢复设置鼠标原样:
qwidget.unsetCursor()
setCursor(arg__1: Union[PySide6.QtGui.QCursor,PySide6.QtCore.Qt.CursorShape,PySide6.QtGui.QPixmap])-> None
设置鼠标形状
CursorShape需要导入 from PySide6.QtCore import Qt
支持以下形状:
参数 | 形状 | 参数 | 形状 | 参数 | 形状 |
---|---|---|---|---|---|
Qt.CursorShape.ArrowCursor | ![]() | Qt.CursorShape.UpArrowCursor | ![]() | Qt.CursorShape.CrossCursor | ![]() |
Qt.CursorShape.IBeamCursor | ![]() | Qt.CursorShape.WaitCursor | ![]() | Qt.CursorShape.BusyCursor | ![]() |
Qt.CursorShape.ForbiddenCursor | ![]() | Qt.CursorShape.PointingHandCursor | ![]() | Qt.CursorShape.WhatsThisCursor | ![]() |
Qt.CursorShape.SizeVerCursor | ![]() | Qt.CursorShape.SizeHorCursor | ![]() | Qt.CursorShape.SizeBDiagCursor | ![]() |
Qt.CursorShape.SizeAllCursor | ![]() | Qt.CursorShape.SplitVCursor | ![]() | Qt.CursorShape.SplitHCursor | ![]() |
Qt.CursorShape.OpenHandCursor | ![]() | Qt.CursorShape.ClosedHandCursor | ![]() | Qt.CursorShape.BlankCursor | 不显示空白 |
import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QWidget,QApplication,QComboBox
cur={
"ArrowCursor": Qt.CursorShape.ArrowCursor,
"UpArrowCursor": Qt.CursorShape.UpArrowCursor,
"CrossCursor": Qt.CursorShape.CrossCursor,
"IBeamCursor": Qt.CursorShape.IBeamCursor,
"WaitCursor": Qt.CursorShape.WaitCursor,
"BusyCursor": Qt.CursorShape.BusyCursor,
"ForbiddenCursor": Qt.CursorShape.ForbiddenCursor,
"PointingHandCursor": Qt.CursorShape.PointingHandCursor,
"WhatsThisCursor": Qt.CursorShape.WhatsThisCursor,
"SizeVerCursor": Qt.CursorShape.SizeVerCursor,
"SizeHorCursor": Qt.CursorShape.SizeHorCursor,
"SizeBDiagCursor": Qt.CursorShape.SizeBDiagCursor,
"SizeAllCursor": Qt.CursorShape.SizeAllCursor,
"SplitVCursor": Qt.CursorShape.SplitVCursor,
"SplitHCursor": Qt.CursorShape.SplitHCursor,
"OpenHandCursor": Qt.CursorShape.OpenHandCursor,
"ClosedHandCursor": Qt.CursorShape.ClosedHandCursor,
"BlankCursor": Qt.CursorShape.BlankCursor
}
def change_cur(win,_cur):
win.setCursor(cur[_cur])
app=QApplication(sys.argv)# 初始化界面
qwidget=QWidget()# 生成一个主窗口
qwidget.resize(500,500)
qwidget.setWindowFlags(Qt.WindowStaysOnTopHint)# 置顶
cue_l=list(cur.keys())
qcombobox=QComboBox(qwidget)
qcombobox.resize(300,35)
qcombobox.move((qwidget.width()- qcombobox.width())// 2,(qwidget.height()- qcombobox.height())// 4)
qcombobox.addItems(cue_l)
qcombobox.activated.connect(lambda: change_cur(qwidget,qcombobox.currentText()))
qwidget.show()# 显示窗口以及其子控件
sys.exit(app.exec())# 主循环和退出
自定义QCursor对象
获取鼠标
导入:from PySide6.QtGui import QCursor,QPixmap
获取QCursor对象
QCursor(self)-> None
QCursor(self,bitmap: Union[PySide6.QtGui.QBitmap,str],mask: Union[PySide6.QtGui.QBitmap,str],hotX: int=-1,hotY: int=-1)-> None
QCursor(self,cursor: Union[PySide6.QtGui.QCursor,PySide6.QtCore.Qt.CursorShape,PySide6.QtGui.QPixmap])-> None
QCursor(self,pixmap: Union[PySide6.QtGui.QPixmap,PySide6.QtGui.QImage,str],hotX: int=-1,hotY: int=-1)-> None
QCursor(self,shape: PySide6.QtCore.Qt.CursorShape)-> None
以上是方法注释
自定义鼠标形状
自定义 QCursor对象
后通过 setCursor(QCursor)
设置自定义形状
import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import QCursor,QPixmap
from PySide6.QtWidgets import QWidget,QApplication
app = QApplication(sys.argv)# 初始化界面
qwidget = QWidget()# 生成一个主窗口
qwidget.resize(500,500)
qwidget.setWindowFlags(Qt.WindowStaysOnTopHint)# 置顶
shape = QPixmap(../../Resources/Images/d8.png")# QPixmap对象鼠标形状
qcursor = QCursor(shape)# 获取QCursor对象
qwidget.setCursor(qcursor)# 设置鼠标形状为自定义QCursor对象
qwidget.show()# 显示窗口以及其子控件
sys.exit(app.exec())# 主循环和退出
设置自定义鼠标大小
通过设置 QPixmap
对象设置
shape=QPixmap("./d8.png")# QPixmap对象鼠标形状
shape=shape.scaled(50,50) # scaled修改尺寸需要注意返回的是一个新的对象
import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import QCursor,QPixmap
from PySide6.QtWidgets import QWidget,QApplication
app = QApplication(sys.argv)# 初始化界面
qwidget = QWidget()# 生成一个主窗口
qwidget.resize(500,500)
qwidget.setWindowFlags(Qt.WindowStaysOnTopHint)# 置顶
shape = QPixmap(../../Resources/Images/d8.png")# QPixmap对象鼠标形状
shape = shape.scaled(50,50)
qcursor = QCursor(shape)# 获取QCursor对象
qwidget.setCursor(qcursor)# 设置鼠标形状为自定义QCursor对象
qwidget.show()# 显示窗口以及其子控件
sys.exit(app.exec())# 主循环和退出
对比上一个自定义发现明显变小
设置自定义鼠标热点位置
默认自定义时鼠标形状时间可点击位置为鼠标图标中间
在获取QCursor对象时传入参数hotX、hotY即可
qcursor=QCursor(shape,0,0)
"""
QCursor(self,pixmap: Union[PySide6.QtGui.QPixmap,PySide6.QtGui.QImage,str],hotX: int=-1,hotY: int=-1)-> None
"""
import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import QCursor,QPixmap
from PySide6.QtWidgets import QWidget,QApplication
app = QApplication(sys.argv)# 初始化界面
qwidget = QWidget()# 生成一个主窗口
qwidget.resize(500,500)
qwidget.setWindowFlags(Qt.WindowStaysOnTopHint)# 置顶
shape = QPixmap(../../Resources/Images/d8.png")# QPixmap对象鼠标形状
shape = shape.scaled(50,50)
qcursor = QCursor(shape,25,50)# 获取QCursor对象
qwidget.setCursor(qcursor)# 设置鼠标形状为自定义QCursor对象
qwidget.show()# 显示窗口以及其子控件
sys.exit(app.exec())# 主循环和退出
鼠标跟踪
所谓的鼠标跟踪,其实就是设置检测鼠标移动事件的条件.
不跟踪 鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件 跟踪 鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件
hasMouseTracking()
判定是否设置了鼠标跟踪setMouseTracking(bool)
设置鼠标是否跟踪
事件
当一个控件被触发了一个特定的行为时,就会调用特定的方法,来将事件传递给开发人员,方便处理 重写这些事件方法,就可以监听相关的信息
事件 | 说明 |
---|---|
显示和关闭事件 | showEvent(QShowEvent)控件显示时调用 closeEvent(QCloseEvent)控件关闭时调用 |
移动事件 | moveEvent(QMoveEvent)控件移动时调用 |
调整大小 | moveEvent(QMoveEvent)控件移动时调用 resizeEvent(QResizeEvent)控件调整大小时调用 |
鼠标事件 | enterEvent(QEvent)鼠标进入时触发 leaveEvent(QEvent)鼠标离开时触发 mousePressEvent(QMouseEvent)鼠标按下时触发 mouseReleaseEvent(QMouseEvent)鼠标释放时触发 mouseDoubleClickEvent(QMouseEvent)鼠标双击时触发 mouseMoveEvent(QMouseEvent)鼠标按下后移动时触发 setMouseTracking(True)追踪设置后,没有按下的移动也能触发 |
键盘事件 | keyPressEvent(QKeyEvent)键盘按下时调用 keyReleaseEvent(QKeyEvent)键盘释放时调用 |
焦点事件 | focusInEvent(QFocusEvent)获取焦点时调用 focusOutEvent(QFocusEvent)失去焦点时调用 |
拖拽事件 | dragEnterEvent(QDragEnterEvent)拖拽进入控件时调用 dragLeaveEvent(QDragLeaveEvent)拖拽离开控件时调用 dragMoveEvent(QDragMoveEvent)拖拽在控件内移动时调用 dropEvent(QDropEvent)拖拽放下时调用 |
绘制事件 | paintEvent(QPaintEvent)显示控件,更新控件时调用 |
改变事件 | changeEvent(QEvent)窗体改变,字体改变/最小化时调用 |
右键菜单 | contextMenuEvent(QContextMenuEvent)访问右键菜单时调用 |
输入法 | inputMethodEvent(QInputMethodEvent)输入法调用 |
父子关系
方法 | 说明 |
---|---|
childAt(x,y) | 获取在指定坐标的控件 |
parentWidget() | 获取指定控件的父控件 |
childrenRect() | 所有子控件组成的边界矩形(左上X,左上Y,右下X,右下Y) |
用法扩展:
- 点击哪个标签,就让哪个标签背景变红,利用鼠标点击事件和childAt()(监听标签的点击事件也可以代码比较麻烦)
层级控制
同级控件需要调整控件Z轴顺序用
方法 | 说明 |
---|---|
lower() | 将控件降低到最底层 |
raise_() | 将控件提升到最上层 |
a.stackUnder(b) | 让a放在b下面 |
交互状态
是否可用
方法 | 说明 |
---|---|
setEnabled(bool) | 设置控件是否禁用 |
isEnabled() | 获取控件是否可用 |
是否显示/隐藏
方法 | 说明 |
---|---|
setVisible(bool) | 设置控件是否绘制(默认是绘制的),不绘制则不可见,配合绘制事件一起使用 绘制是先绘制父控件后绘制子控件,未绘制父控件子控件也不展示,控件被遮挡覆盖也是会绘制的 setVisible(True)绘制 setVisible(False)不绘制 |
setHidden(bool) | 设置控件是否隐藏,同样需要父控件绘制了才能展示,本质还是调用setVisible(bool) setHidden(False)展示控件``setHidden(True)隐藏控件 |
show() | 展示控件,效果同 setVisible(False) 、setHidden(True) |
hide() | 隐藏控件,效果同 setVisible(True) 、setHidden(False) |
isHidden() | 判定控件是否被隐藏,无论是否绘制父控件 没有直接对控件设置 setVisible(True) 、setHidden(False) 、isHidden() 均是True |
isVisible() | 判定控件是否设置绘制,当控件的父控件和自身均被绘制才会返回True |
isVisibleTo(widget) | 判断控件是否会随着widget控件显示和隐藏同步变化 |
注意 visible:代表控件最终的状态,是否被我们所见(被其他控件遮挡也属于可见)
hide:可理解为相对于父控件是否可见
隐藏的一定是不可见的,反之不然
显示正在编辑状态
方法 | 说明 |
---|---|
setWindowModified(bool) | 设置窗口是否是被编辑状态 仅支持在设置 [*] 其他符号不支持应用:设置如窗口标题等在设置标题str中任意索引位置加入 [*] ,当设置 setWindowModified(True) 时会自动显示 * ,反之则不显示 * ![]() |
isWindowModified() | 获取是否是被编辑状态 |
是否为活跃窗口
方法 | 说明 |
---|---|
isActiveWindow() | 是否为活跃窗口,主要用于多窗口当前焦点出口则处是活跃的 会自动在活跃窗口周围加上光效阴影 层级控制也不会影响活跃状态 |
activateWindow() | 设置成活动窗口,活动窗口可以获得键 盘输入 |
关闭
方法 | 说明 |
---|---|
close() | 关闭窗口,效果同隐藏 但设置 setAttribute(Qt.WA_DeleteOnClose,True) 后会在隐藏的同时销毁原对象 |
setAttribute(Qt.WA_DeleteOnClose,True) | 设置 close() 时并一同销毁对象会触发销毁事件 |
信息提示
状态栏提示
需要添加状态栏才能使用
方法 | 说明 |
---|---|
statusTip() | 获取状态栏提示 |
setStatusTip(str) | 鼠标停在控件上时,展示在状态栏 |
工具提示
方法 | 说明 |
---|---|
toolTip() | 获取工具提示 |
setToolTip(str) | 设置工具提示 |
toolTipDuration() | 获取工具提示时长 |
setToolTipDuration(msec) | 设置提示时长,单位毫秒 |
whatsThis提示
需要更改状态flags,进入?模式
方法 | 说明 |
---|---|
whatsThis() | |
setWhatsThis(str) | 切换到"查看这是啥"模式,点击该控件时显示 |
焦点控制
单个控件角度
方法 | 说明 |
---|---|
setFocus() | 指定控件获取焦点 |
setFocusPolicy(Policy) | 设置焦点获取策略 |
Policy枚举 | 说明 |
---|---|
Qt.TabFocus | 通过Tab键获得焦点 |
Qt.ClickFocus | 通过被单击获得焦点 |
Qt.StrongFocus | 可通过上面两种方式获得焦点 |
Qt.NoFocus | 不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点 |
clearFocus() | 取消焦点,系统会自动给第一个控件赋予焦点 |
父控件角度
结合程序的业务逻辑,来调整焦点的操作。如按下TAB时切换到下一个输入框等
方法 | 说明 |
---|---|
clearFocus() | 取消焦点 |
focusWidget() | 获取子控件中当前聚焦的控件 |
focusNextChild() | 聚焦下一个子控件 |
focusPreviousChild() | 聚焦上一个子控件 |
focusNextPrevChild(bool) | True下一个; False上一个 |
setTabOrder(pre_widget,next_widget) | 静态方法 设置子控件获取焦点的先后顺序 |
属性
setAttribute(Qt :: WidgetAttribute 属性,bool on=true)
遮罩
QWidget :: mask()const
返回当前在小部件上设置的遮罩。如果没有设置掩码,返回值将是一个空白区域。
另请参阅setMask(),clearMask(),QRegion :: isEmpty()和形状时钟示例。
内容拖拽
setAcceptDrops()
acceptDrops()
交互控制
scroll(int dx,int dy)
repaint()
状态控件
keyboardGrabber()
mouseGrabber()
grabMouse()
nextInFocusChain()
previousInFocusChain()
releaseKeyboard()
快捷方式
setShortcutAutoRepeat(id:int,enable:bool=true)
setShortcutEnabled(id:int,enable:bool=true)
grabShortcut()和releaseShortcut()
坐标转换
方法 | 返回参数 | 说明 |
---|---|---|
mapFrom(QWidget,QPoint) mapFrom(QWidget,QPointF) | QPoint / QPointF | 将小部件坐标pos从父级的坐标系转换为此小部件的坐标系。父级不能为None,并且必须是调用小部件的父级。 |
mapFromGlobal(QPoint) mapFromGlobal(QPointF) | QPoint/ QPointF | 将全局屏幕坐标pos转换为小部件坐标。 |
mapFromParent(QPoint) mapFromParent(QPointF) | QPoint/ QPointF | 将父小部件坐标pos转换为小部件坐标。 如果小部件没有父级,则与mapFromGlobal()相同。 |
mapTo(QWidget,QPoint) mapTo(QWidget,QPointF) | QPoint/ QPointF | 将小部件坐标pos转换为父对象的坐标系。父级不能为None,并且必须是调用小部件的父级。 |
mapToGlobal(QPoint) mapToGlobal(QPointF) | QPoint/ QPointF | 将小部件坐标pos转换为全局屏幕坐标。例如,mapToGlobal(QPointF(0,0)将给出小部件左上角像素的全局坐标。 |
mapToParent(QPoint) mapToParent(QPointF) | QPoint/ QPointF | 将小部件坐标pos转换为父小部件中的坐标。 如果小部件没有父级,则与mapToGlobal()相同。 |