PyQt5的核心模块之一QtWidgets

674 阅读4分钟

一、QtWidgets主要子类

在PyQt中,我们如果想要实现一个窗口(就是我们看到的界面),我们有三种方式 QWidget | QMainWindow | QDialog,都是 QtWidgets 的子类

1. QWidget:

控件和窗口的父类 ,自由度高(什么东西都没有),没有划分菜单、工具栏、状态栏、主窗口 等区域

2. QMainWindow:

是 QWidget的子类(QWidget 是 QtWidgets 的子类),包含菜单栏,工具栏,状态栏,标题栏等,中间部分则为主窗口区域

3. QDialog:

对话框窗口的基类,一般就是一个弹出窗口

这里最关键的就是 QWidget 和 QMainWindow 的区别

最大的区别就在于它们的初始化后的结构:QWidget 就是一个白板,没有任何布局;而 QMainWindow 会有菜单栏,工具栏,状态栏,标题栏等,中间部分则为主窗口区域,这主窗口区域一般会使用一个 QWidget 当作容器。另外,使用 QMainWindow 可以更方便地创建具有各种标准布局的主窗口。

二、例子解释

前面没有具体的感觉没关系,下面直接给你代码例子。

第一个是 QWidget 的例子
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class window(QWidget): # 继承 QWidget
    def __init__(self): # 本类初始化
        super().__init__() # 父类(Qwidget)初始化

        # 以下为Qwidget的内容,self 这里代表父类Qwidget
        self.resize(950, 580) # 设定窗口大小
        self.setWindowTitle("tuleaj")

        self.label = QLabel(self) # 一个标签组件,并将其父组件设置为 window 类
        self.label.setText("This is QWidget!")
        
    
def main():
    app = QApplication(sys.argv) # 程序的起点
    ex = window() # 主要的程序体
    ex.show()
        
    # 如果执行异常则退出
    sys.exit(app.exec())

if __name__=="__main__":
    main()

运行结果:

image.png

解释:QWidget 初始化后什么也没有,换句话说就是自定义程度高,所有的组件都需要自己手动添加设置并布局。

第二个是 QMainWindow 的例子
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class window(QMainWindow):
    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle("tuleaj")
        self.resize(950, 580)

        """菜单栏"""
        self.menuBar = QMenuBar(self)
        self.menuBar.setGeometry(QRect(0, 0, 953, 230))
        self.menuBar.setDefaultUp(True)

        # 将QMainWindow的菜单栏设置为 menuBar
        self.setMenuBar(self.menuBar)   # 这类语句就是设定语句,将相应部分设定为自定义的
        self.menu_F = QMenu(self.menuBar)
        self.menu_F.setTitle("文件(F)")
        # 给文件(F)一个按钮
        self.menuBar.addAction(self.menu_F.menuAction())
		
        """工具栏"""
        self.mainToolBar = QToolBar(self)
        self.addToolBar(Qt.TopToolBarArea, self.mainToolBar)
        self.mainToolBar.setMaximumHeight(30)

        self.start_action = QAction(self)
        self.start_action.setText("开始")

        self.mainToolBar.addAction(self.start_action)

        """状态栏"""
        self.statusBar = QStatusBar(self)
        self.setStatusBar(self.statusBar)
        self.comNum = QLabel('下载速度')
        self.statusBar.addPermanentWidget(self.comNum, stretch=1)

        """中间客户区"""
        self.centralWidget = QWidget(self)

        self.label = QLabel(self.centralWidget)
        self.label.setText("This is centralWidget!")
        self.setCentralWidget(self.centralWidget)


def main():
    app = QApplication([])

    test = window()
    test.show()

    app.exec()

if __name__=="__main__":
    main()

运行结果:

image.png 解析:这段代码稍微有点复杂,详细解释看注释。这里来介绍一下各部件。

图中最上面 tuleaj 为标题栏

下面一层 文件(F) 为菜单栏

再下面一层 开始 为工具栏

最底层一行 下载速度 是状态栏

中间写有 This is centralWidget! 文字的就是中间客户区,实际上,工具栏到状态栏之间一大片都是的,这一片通常采用一个 QWidget 当界面,更加具体的可以看代码

第三个是 QDialog 的例子
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class window(QWidget):
    def __init__(self, parent = None): # 本类初始化
        super().__init__(parent) # 父类(Qwidget)初始化

        # 以下为Qwidget的内容,self 这里代表父类Qwidget
        self.resize(950, 580)
        self.setWindowTitle("tuleaj")

        btn = QPushButton('点击', self)
        # 这是PyQt的信号与槽机制,看不到没关系
        # 这里就是演示一下 Dialog 最常见的用法
        btn.clicked.connect(self.dialog)

    def dialog(self):
        # 不过对话框一般不应该作为主窗口的存在,而是通过点击操作弹出,起到提示作用
        # QMessageBox 是 QDialog的子类,一般使用的都是QDialog的子类
        # QMessageBox 类(消息对话框) QErrorMessage 类(错误消息对话框) QColorDialog 类(颜色对话框)...
        QMessageBox.question(self, "Message", "This is Dialog!",
              QMessageBox.Save | QMessageBox.Close | QMessageBox.Cancel, QMessageBox.Cancel
          )
    
def main():
    app = QApplication(sys.argv) # 程序的起点
    ex = window() # 主要的程序体
    ex.show()
        
    # 如果执行异常则退出
    sys.exit(app.exec())

if __name__=="__main__":
    main()

运行结果:

image.png

解释:这次代码为什么不直接继承 QDialog ,而是依然继承 QWidget ,因为QDialog在平常的使用中就是这样用的,QDialog是对话框,一般不应该作为主窗口的存在,而是通过点击操作弹出,起到提示作用,QMessageBox是QDialog的子类,我们一般直接使用子类,直接继承 QDialog 一般在于你想自己定义一个对话框的场景。

三、QtWidgets常用类

窗口和对话框

  • QMainWindow - 应用程序的主窗口。
  • QWidget - 所有用户界面对象的基类。
  • QDialog - 对话框的基类。
  • QMessageBox - 用于显示消息的对话框。

布局

  • QHBoxLayout - 水平布局。
  • QVBoxLayout - 垂直布局。
  • QGridLayout - 在网格中组织小部件。
  • QFormLayout - 表单布局。

常用控件

  • QLabel - 显示文本或图片。
  • QPushButton - 命令按钮。
  • QRadioButton - 单选按钮。
  • QCheckBox - 多选框。
  • QSlider - 滑块控件。
  • QProgressBar - 进度条。
  • QLineEdit - 单行文本输入框。
  • QTextEdit - 多行文本编辑控件。
  • QComboBox - 下拉选择框。
  • QSpinBox - 数字输入框。
  • QDateEditQTimeEditQDateTimeEdit - 日期和时间输入控件。

容器类控件

  • QGroupBox - 分组框,用于将界面中的控件分组。
  • QTabWidget - 标签页控件,可以包含多个标签页。
  • QStackedWidget - 可以按需显示其中一个控件。
  • QSplitter - 分隔控件,允许用户调整子控件大小。
  • QScrollArea - 提供滚动视图。
  • QFrame - 框架控件,可以用于装饰。

高级控件

  • QTreeWidget - 显示树形结构数据。
  • QListWidget - 显示列表数据。
  • QTableWidget - 显示表格数据。

图形视图框架类

  • QGraphicsScene - 为图形项提供一个表面。
  • QGraphicsView - 显示QGraphicsScene

———————————————

原文链接:blog.csdn.net/qq_65380630…