PyQt5 主窗口类型有三个, 分别是QMainWindow , Qwidget, Qdialog, 那么它们之间的区别是什么呢?

主窗口类型介绍

QMainWindow 可以包含菜单栏, 工具栏, 状态栏和标题栏,是最常用的窗口形式;
Qdialog 是对话窗口的基类, 没有菜单栏,工具栏, 状态栏;
Qwidget 不确定窗口的用途, 就使用Qwidget .

主窗口类型的使用细节

1.如果使用的是 QMainWindow, 就需要先创建布局,然后给主框架添加布局, 最后通过充满整个屏幕让主框架显示出来.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QToolTip,QHBoxLayout,QWidget
from PyQt5.QtGui import QFont
import sys

class MainWindowTipUse(QMainWindow):
def __init__(self):
super().__init__()
self.setUI()

def setUI(self):
self.setWindowTitle("试试设置提示看看")
self.resize(300,500)
# 设置tip的字体, 使用通用的字体, 指定字体的大小
QToolTip.setFont(QFont('SansSerif',12))
# 设置整个窗口的tip
self.setToolTip("今天是<b>星期天</b>")
# 创建一个按钮
self.button = QPushButton("按钮")
# 设置按钮的 tip
self.button.setToolTip("不要摸我")
# 创建布局和往布局里添加一个按钮
layout = QHBoxLayout()
layout.addWidget(self.button)
# 创建主框架, 往主框架里添加布局
mainFrame = QWidget()
mainFrame.setLayout(layout)
# 把主框架显示在屏幕
self.setCentralWidget(mainFrame)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindowTipUse()
window.show()
sys.exit(app.exec_())

2.如果使用的是Qwidget, 就只需要到设置布局即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# QVBoxLayout 是垂直布局
from PyQt5.QtWidgets import QApplication,QVBoxLayout,QLabel,QMainWindow,QWidget
# QPixmap 用于Picture, QPalette 是调色板
from PyQt5.QtGui import QPixmap, QPalette
# 很多QT的基本功能, 包括颜色等
from PyQt5.QtCore import Qt
import sys

class QlableDemoUse(QWidget):
def __init__(self):
super().__init__()
self.setUi()

def setUi(self):
self.setWindowTitle("Qlable使用")
self.resize(500, 600)
lable1 = QLabel(self)
lable2 = QLabel(self)
lable3 = QLabel(self)
lable4 = QLabel(self)

lable1.setText("<font color=yellow>文本标签</font>")
# 允许设置背景颜色
lable1.setAutoFillBackground(True)
# 创建一个调色板
palette = QPalette()
# # 设置lable的背景颜色
# palette.setColor(QPalette.window, Qt.blue) 视频里旧版本的用法,现在的pyqt5版本用不了
# PyQt55.15.2 这是我使用的版本
palette.setColor(QPalette.Background, Qt.blue)
lable1.setPalette(palette)
# 设置文本的对齐样式
lable1.setAlignment(Qt.AlignCenter)
# 不设置文本对齐样式,就是默认从左边对齐
lable2.setText("<a href= '#'>欢迎使用python GUI</a>")
lable2.setAlignment(Qt.AlignLeft)
# label3 设置添加图片
lable3.setPixmap(QPixmap("../images/python.jpg"))
lable3.setAlignment(Qt.AlignCenter)
# 当为True的时候, 就只会打开浏览器去到对应的链接,不会再触发槽
# 默认是False, 不设置就是False, 就会触发槽, 打开浏览器和触发槽只能触发一个
lable4.setOpenExternalLinks(True)
lable4.setText("<a href='https://123.twinkstar.cn/'>看看百度</a>")
lable4.setAlignment(Qt.AlignRight)
lable4.setToolTip("这是一个超链接")
# 绑定信号与槽
lable2.linkHovered.connect(self.linkHovered)
lable4.linkActivated.connect(self.linkClicked)
# 设置垂直布局
vbox = QVBoxLayout()
vbox.addWidget(lable1)
vbox.addWidget(lable2)
vbox.addWidget(lable3)
vbox.addWidget(lable4)
self.setLayout(vbox)

def linkHovered(self):
print("当鼠标划过lable2的时候")

def linkClicked(self):
print("当鼠标点击lable4标签的时候")

if __name__ == '__main__':
app = QApplication(sys.argv)
window = QlableDemoUse()
window.show()
sys.exit(app.exec_())

3.如果使用的是 Qdialog 配合栅格布局, 则更加方便, 连self.setLayout 都不用,因为栅格布局本身就是一个清晰的布局了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from PyQt5.QtWidgets import *
import sys

# QDialog 是对话框的基类
class GridWindow(QDialog):
def __init__(self):
super().__init__()
self.setUi()

def setUi(self):
self.setWindowTitle("lable设置伙伴关系")
# 设置热键. 这个self 可以不用传了
# self.lable1 = QLabel("&Name", self)
self.lable1 = QLabel("&Name")
self.name_edit = QLineEdit()
# 设置 伙伴关系
self.lable1.setBuddy(self.name_edit)
self.lable2 = QLabel("&Password")
self.pwd_edit = QLineEdit()
self.lable2.setBuddy(self.pwd_edit)
# 在QDialog 设置 栅格布局要传递 self, 否则图形布局就会混乱
layout = QGridLayout(self)
layout.addWidget(self.lable1, 0,0)
# 四个参数,分别是 控件对象, 行索引,列索引,行数,列数(即尺寸)
layout.addWidget(self.name_edit, 0,1,1,2)
layout.addWidget(self.lable2,1,0)
layout.addWidget(self.pwd_edit,1,1,1,2)
self.button_ok = QPushButton("确定")
self.button_cannel = QPushButton("放弃")
layout.addWidget(self.button_ok,2,0)
layout.addWidget(self.button_cannel,2,1)
# self.setLayout(layout) 这个有没有都可以,因为已经设置了栅格布局了
if __name__ == '__main__':
app = QApplication(sys.argv)
window = GridWindow()
window.show()
sys.exit(app.exec_())

总结: 应该就是只有 QMainWindow, 需要先创建布局,然后给主框架添加布局, 最后通过充满整个屏幕让主框架显示出来.另外两个就不需要这样.