這篇教學如何在 PyQt5 偵測視窗的位置、尺寸與縮放行為,並透過對應的方法,進一步控制視窗的尺寸和位置,最後還會介紹視窗相對應的事件,當視窗事件發生時,就能進行對應的動作。
原文參考:偵測與控制視窗
因為 Google Colab 不支援 PyQt5,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
在 PyQt5 裡建立最底層的視窗 Widget 元件之後,只要套用對應的偵測方法,就可以偵測視窗的屬性,下方列出常用的偵測方法:
方法 | 說明 |
---|---|
x() | 視窗在螢幕裡的 x 座標。 |
y() | 視窗在螢幕裡的 y 座標。 |
width() | 視窗的寬度。 |
height() | 視窗的高度。 |
windowTitle() | 視窗的標題。 |
以下方的程式碼執行後,會開啟一個空白的視窗,並使用 QLabel 印出視窗的相關資訊。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setGeometry(10,10,200,200)
label.setText(f'''
x: {Form.x()}
y: {Form.y()}
w: {Form.width()}
h: {Form.height()}
t: {Form.windowTitle()}
''')
Form.show()
sys.exit(app.exec_())
在 PyQt5 裡建立最底層的視窗 Widget 元件之後,只要套用對應的控制方法,就可以控制與設定視窗,下方列出常用的控制方法:
方法 | 參數 | 說明 |
---|---|---|
setWindowTitle() | str | 視窗標題。 |
resize() | width(int), height(int) | 改變視窗尺寸。 |
move() | x(int), y(int) | 設定視窗位置。 |
setGeometry() | x(int), y(int), width(int), height(int) | 設定視窗位置與尺寸。 |
setFixedWidth() | hwidth(int) | 固定視窗寬度。 |
setFixedHeight() | height(int) | 固定視窗高度。 |
setFixedSize() | width(int), height(int) | 固定視窗尺寸。 |
showMinimized() | 視窗最小化。 | |
showMaximized() | 視窗最大化。 | |
showFullscreen() | 視窗全螢幕。 | |
showNormal() | 視窗恢復原本尺寸。 |
下方的例子執行後,會建立三顆按鈕,並將三顆按鈕的點擊行為綁定 lambda 匿名函式,使得點擊按鈕時會進行最大化視窗、恢復視窗以及移動視窗的效果。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
btn1 = QtWidgets.QPushButton(Form)
btn1.setGeometry(10,10,100,30)
btn1.setText('最大化')
btn1.clicked.connect(lambda: Form.showMaximized()) # 最大化
btn2 = QtWidgets.QPushButton(Form)
btn2.setGeometry(110,10,100,30)
btn2.setText('恢復大小')
btn2.clicked.connect(lambda: Form.showNormal()) # 恢復原本大小
btn3 = QtWidgets.QPushButton(Form)
btn3.setGeometry(10,50,100,30)
btn3.setText('移動視窗')
btn3.clicked.connect(lambda: Form.move(100, 100)) # 移動到 (100, 100)
Form.show()
sys.exit(app.exec_())
在控制視窗位置與尺寸時,有時需要獲取電腦螢幕的資訊,使用 QtWidgets.QApplication.desktop()
之後,就能透過下列的方法取得電腦螢幕的尺寸。
方法 | 說明 |
---|---|
width() | 電腦螢幕的寬度。 |
height() | 電腦螢幕的高度。 |
下方的程式碼執行後,會根據電腦螢幕的尺寸,以及視窗的尺寸,換算出視窗置中的座標 ( 座標必須為整數 ),進而讓視窗置中顯示。
from PyQt5 import QtWidgets,
import sys
app = QtWidgets.QApplication(sys.argv)
screen = QtWidgets.QApplication.desktop()
screen_w = screen.width() # 電腦螢幕寬度
screen_h = screen.height() # 電腦螢幕高度
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
Form_w = Form.width() # 視窗寬度
Form_h = Form.height() # 視窗高度
new_x = int((screen_w - Form_w)/2) # 計算後的 x 座標
new_y = int((screen_h - Form_h)/2) # 計算後的 y 座標
Form.move(new_x, new_y) # 移動視窗
Form.show()
sys.exit(app.exec_())
下方列出常用的視窗事件,可以在視窗顯示、關閉、移動、縮放或焦點改變時觸發。
事件 | 說明 |
---|---|
showEvent | 開啟視窗。 |
closeEvent | 關閉視窗。 |
moveEvent | 移動視窗。 |
resizeEvent | 視窗尺寸改變。 |
focusInEvent | 視窗為焦點 ( 需要先使用 setFocus() 方法 )。 |
focusOutEvent | 視窗失去焦點,使用者操作其他視窗 ( 需要先使用 setFocus() 方法 )。 |
下方的程式碼執行後,用滑鼠改變視窗大小或位置,就能看見後台印出對應的事件內容。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
def close(self):
print('close!!')
def move(self):
print('move...')
def resize(self):
print('resize')
def show(self):
print('show')
def focusIn(self):
print('focus in')
def focusOut(self):
print('focus out')
Form.closeEvent = close
Form.moveEvent = move
Form.resizeEvent = resize
Form.showEvent = show
Form.setFocus()
Form.focusInEvent = focusIn
Form.focusOutEvent = focusOut
Form.show()
sys.exit(app.exec_())
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^