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

主窗口类型介绍

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

主窗口类型的使用细节

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

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, 就只需要到设置布局即可

# 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 都不用,因为栅格布局本身就是一个清晰的布局了

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, 需要先创建布局,然后给主框架添加布局, 最后通过充满整个屏幕让主框架显示出来.另外两个就不需要这样.