一、窗口标志位
在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()
来刷新显示窗口,否则窗口会消失。