文章目錄
- 一、視窗标志位
- 二、視窗标志的使用
-
- 1. 設定視窗标志的方法
- 2. 示例
- 3. 應用:通過滑鼠點選顯示和影藏邊框
一、視窗标志位
在pyQt中,對于沒有父控件的控件,會自動添加标題欄,我們稱之為“視窗”,一下代碼建立了一個QWidget控件:
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w1 = QWidget()
w1.show()
sys.exit(app.exec_())
由于其沒有父控件,是以自動添加标題欄,稱為一個視窗:

可以看到,程式沒有指定大小,圖示,标題名稱,是以以上均有程式預設樣式。這是一個最基本,常見的視窗,但是一些時候,我們并不需要一個這樣的視窗,比如,在彈出的提示對話框中,可能隻需要一個關閉按鈕,一些特殊的視窗是禁止使用者改變其大小的,以及當我們要自定義标題欄的時候,就需要影藏預設的标題欄…這一些都可以通過視窗标志(
flags
)來實作。
二、視窗标志的使用
1. 設定視窗标志的方法
我們可以通過以下方法來設定視窗标志:
- 建立對象時候,直接設定flags的值
- 通過函數
設定setWindowFlag()
- 通過函數
設定,與setWindowFlags()
的差別是可以同時設定多個标志位setWindowFlag()
2. 示例
以下程式示例了如何通過标志位建立不同的視窗:
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
#0.建立一個預設視窗
w0 = QWidget()
w0.move(100,100)
w0.show()
#1.建立一個無法調整大小的視窗
w1 = QWidget(flags=Qt.MSWindowsFixedSizeDialogHint)
w1.move(200,200)
w1.show()
#2. 建立一個隐藏邊框的視窗
w2 = QWidget()
w2.setWindowFlag(Qt.FramelessWindowHint)
w2.move(300,300)
w2.show()
#3. 建立一個隐藏标題欄的視窗,并置頂
w3 = QWidget()
w3.setWindowFlags(Qt.CustomizeWindowHint|Qt.WindowStaysOnTopHint)
w3.move(400,400)
w3.show()
sys.exit(app.exec_())
程式運作如下所示:
第一個視窗:最普通的視窗,可以最大化,最小化,可以移動,可以關閉,也可以設定大小
第二個視窗:禁止使用者改變大小的視窗,可以看到最大化按鍵變成灰色,也無法通過拖拽邊緣來改變大小
第三個視窗:沒有标題欄,無法移動,改變大小等
第四個視窗:隐藏标題欄并且置頂,可以改變大小,但是無法移動
可以發現,
setWindowFlags()
函數是通過或符号“|”來分隔多個視窗标志的,測試過程中發現,不少參數在
setWindowFlags()
中有效,但是在
setWindowFlag()
是無效的,是以這類建議使用
setWindowFlags()
來設定視窗标志位。
關于更多的視窗标志位,可以檢視Qt官方文檔:視窗标志位
3. 應用:通過滑鼠點選顯示和影藏邊框
這一小節實作一個簡單的功能,建立一個普通的視窗,通過點選滑鼠左鍵可以顯示邊框,通過點選滑鼠右鍵,可以隐藏邊框。其代碼如下所示:
from PyQt5.Qt import *
import sys
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("視窗移動")
self.resize(300, 200)
self.show()
def mousePressEvent(self, evt):
# 滑鼠按鍵為左鍵
if(evt.button() == Qt.LeftButton):
self.setWindowFlags(Qt.FramelessWindowHint) # 隐藏視窗邊框
self.show() # 窗體顯示
print("?鍵,隐藏邊框")
# 滑鼠按鍵為右鍵
if(evt.button() == Qt.RightButton):
self.setWindowFlags(Qt.Widget) # 恢複視窗邊框
self.show() # 窗體顯示
print("?鍵,顯示邊框")
app = QApplication(sys.argv)
w = MyWindow()
if __name__ == '__main__':
sys.exit(app.exec_())
其運作效果如下所示:
注意,每一次改變視窗标志以後,需要使用
show()
來重新整理顯示視窗,否則視窗會消失。