【PyQt】PyQt學(xué)習(xí)(三)QWidget介紹

概述

繼承關(guān)系

QWidget 類是所有 Qt GUI 界面類的基類,是 PyQt 程序中的最小元素,也就是所有可現(xiàn)實(shí)的控件的基類。一個(gè)繼承自 QWidget 的類可以在屏幕上繪制自身,這是因?yàn)?QWidget 繼承了 QPaintDevice 類,該類用于將控件繪制在屏幕上。每一個(gè)可視控件都是矩形的且都按 Z 順序排序,一個(gè)空間的顯示會(huì)被自己的父類(指定的 parent)和其他控件進(jìn)行阻擋。

未嵌入到窗口的可視控件稱之為窗口,例如 QDialog 和 QMainWindow。

重要屬性和功能

位置和大小

QWidget 類最重要的功能是提供了控件的顯示,顯示依賴于兩個(gè)屬性位置和大小,在 PyQt 框架中,控件坐標(biāo)系統(tǒng)以左上角為原點(diǎn),向右為 X 軸的正方向,向下為 Y 軸正方向建立。

每個(gè)控件都有一個(gè)邊框,因此在高度、位置的設(shè)置和獲取上,都有兩種方式,即包含邊框和不包含邊框。

包含框架的位置獲取方法:

  • x():獲取相對(duì)于父控件的 X 位置(沒(méi)有父控件則相對(duì)于桌面);
  • y():相對(duì)于父控件的 Y 位置(沒(méi)有父控件則相對(duì)于桌面);
  • pos():x 和 y 的組合方法,返回QPoint對(duì)象。

不包含框架的位置獲取方法:

  • geometry().x():獲取相對(duì)于父控件的 X 位置;
  • geometry().y():獲取相對(duì)于父控件的 Y 位置;
  • geometry():獲取用戶區(qū)域相對(duì)于父控件的位置和尺寸。

包含框架的大小獲取方法:

  • frameGeometry().width():獲取控件的寬度;
  • frameGeometry().height():獲取控件的高度;
  • frameGeometry():獲取控件尺寸。

不包含框架的大小獲取方法:

  • width():獲取控件的寬度;
  • height():獲取控件的高度;
  • rect():獲取控件寬高。

設(shè)置位置和大小

  • resize():設(shè)置控件的大小(不包含邊框);
  • move():移動(dòng)控件(包括框架);
  • setFixedSize():設(shè)置控件固定尺寸。

除了直接給定控件大小,還可以設(shè)置大小的上下限,相關(guān)方法介紹如下:

  • minimumwidth():獲取最小寬度;
  • minimumheight():獲取最小高度;
  • minimumsize():上面兩個(gè)方法的結(jié)合;
  • maxmumwidth():獲取最小寬度;
  • maxmumheight():獲取最小高度;
  • maxmumsize():上面兩個(gè)方法的結(jié)合方法。

控件層級(jí)

沒(méi)有父窗口小部件的窗口小部件始終是一個(gè)獨(dú)立窗口,對(duì)于這些控件,可以調(diào)用 setWindowTitle()setWindowIcon() 設(shè)置標(biāo)題欄和圖標(biāo)。QWidget 類本身提供了這些方法,但是如果不是頂級(jí)控件,調(diào)用這些方法會(huì)失效。如下圖所示,QGroupBox是父控件,其余的 QLabelQDateEdit 等控件都受它的管理。

父子控件

子控件的生命周期和父控件一致,在創(chuàng)建任何一個(gè)控件的時(shí)候傳遞一個(gè) QWidget 子類實(shí)例作為新創(chuàng)建的控件的父控件。例如 self.widget_2 = QtWidgets.QWidget(self.centralwidget),在 QWidget 類中提供了幾個(gè)方法用于管理父子關(guān)系

  • childAt():獲取在指定坐標(biāo)位置的子控件;
  • parentWidget():獲取指定控件的父控件;
  • childreanRect():獲取所有子控件組成的邊界矩形。

除了這種父子的層級(jí)關(guān)系,控件之間在 Z 軸上還有一種層級(jí)關(guān)系,QWidget 提供了一些方法用來(lái)管理這種關(guān)系:

  • lower():將控件放到最底層;
  • raise():將控件放到最上層;
  • a.stackunder(b):將 a 控件放到指定控件 b 之下。

繪制自定義控件

由于 QWidgetQPaintDevice 的子類,因此子類可使用 QPainter 類的實(shí)例使用一系列繪畫操作,所以如果想要?jiǎng)?chuàng)建自己的控件,最好繼承自 QWidget 類。

每一個(gè)控件都有一個(gè) paintEvent() 方法,在這個(gè)函數(shù)中執(zhí)行所有的繪制操作,每當(dāng)需要重繪控件的時(shí)候都會(huì)調(diào)用該方法。一般的處理方案如下:

def paintEvent(self, a0: QPaintEvent) -> None:  
    ... # 自定義操作
    super(MainWindow, self).paintEvent(a0)

控件尺寸

除了直接指定大小、最大、最小長(zhǎng)寬之外,QWidget 還提供了尺寸策略,這個(gè)主要用于在布局情況下,多個(gè)子控件之間的大小調(diào)整,尺寸策略的可選值如下:

大小策略

默認(rèn)情況下,頂級(jí)控件的大小被限制為桌面高度和寬度的 \frac{2}{3}

事件

在 PyQt 中控件和用戶的交互一般通過(guò)事件,有一個(gè)消息隊(duì)列不斷接收程序產(chǎn)生的事件信息,并將其包裝為QEvent對(duì)象進(jìn)行分發(fā)處理。針對(duì)不同類型的QEvent對(duì)象,每個(gè)控件都有對(duì)應(yīng)的處理函數(shù),比方說(shuō) moveEvent() 用于處理窗口移動(dòng)事件;enterEvent() 用于處理鼠標(biāo)光標(biāo)進(jìn)入事件。

焦點(diǎn)和交互

控制狀態(tài)就是獲取焦點(diǎn)的狀態(tài),一個(gè)控件只有獲取了焦點(diǎn)的控件才能進(jìn)行交互,針對(duì)焦點(diǎn),QWidget 提供了如下函數(shù)進(jìn)行管理;

  • setFocus():指定控件獲取焦點(diǎn);
  • setFocusPolicy():設(shè)置獲取焦點(diǎn)的策略;
  • focuswidget():獲得子控件中當(dāng)前聚焦的控件;
  • focusNextChild():聚焦下一個(gè)子控件;
  • setTabOrder():設(shè)置子控件獲取焦點(diǎn)的順序。

針對(duì)交互,QWdiget 也提供了相應(yīng)的方法:

  • setEnabled():指定控件是否可用;
  • isEnabled():返回控件是否可用;
  • isvisible():代表了控件的最終狀態(tài),即使被其他控件遮擋也算看的見(jiàn);
  • isHidden():代表該控件是否對(duì)父控件可見(jiàn)。

功能總結(jié)

Context Functions and Properties
窗口函數(shù) show() , hide() , raise() , lower() , close() .
頂級(jí)窗口函數(shù) windowModified , windowTitle , windowIcon , isActiveWindow , activateWindow() , minimized , showMinimized() , maximized , showMaximized() , fullScreen , showFullScreen() , showNormal() .
窗口內(nèi)容 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() .
鍵盤和焦點(diǎn) focus , focusPolicy , setFocus() , clearFocus() , setTabOrder() , setFocusProxy() , focusNextChild() , focusPreviousChild() .
鼠標(biāo)和鍵盤 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() ,
系統(tǒng)函數(shù) parentWidget() , window() , setParent() , winId() , find() , metric() .
菜單 contextMenuPolicy , contextMenuEvent() , customContextMenuRequested() , actions()
交互提示 setToolTip() , setWhatsThis()

往期回顧

  1. 【PyQt】PyQt學(xué)習(xí)(二)模塊介紹+QObject學(xué)習(xí)
  2. 【PyQt】PyQt學(xué)習(xí)(一)

文中難免會(huì)出現(xiàn)一些描述不當(dāng)之處(盡管我已反復(fù)檢查多次),歡迎在留言區(qū)指正,相關(guān)的知識(shí)點(diǎn)也可進(jìn)行分享,希望大家都能有所收獲?。∪绻X(jué)得我的文章寫得還行,不妨支持一下。你的每一個(gè)轉(zhuǎn)發(fā)、關(guān)注、點(diǎn)贊、評(píng)論都是對(duì)我最大的支持!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容