PyQt5第五部分-高级控件:QGroupBox, QTreeWidget, QListWidget, QTableWidget

这里写目录标题

  • 0 前言
  • 1 组合框 QGroupBox
    • 1.1 方法列表
    • 1.2 示例 进度条
  • 2 树形窗口 QTreeWidget
    • 2.1 方法列表
    • 2.2 示例 通过字典生成树形窗口并打印
  • 3 列表窗口 QLisWidget
    • 3.1 方法列表
    • 3.2 示例 单击触发槽函数
  • 4 表格窗口 QTableWidget
    • 4.1 方法列表
    • 4.2 示例 QTableWidget的基本用法

0 前言

>>返回Python系列文章目录<<

继承关系:

QWidget

  • QGroupBox
  • QFrame
    • QAbstractScrollArea
      • QAbstractItemView
        • QListView
          • QListWidget
        • QTableView
          • QTableWidget
        • QTreeView
          • QTreeWidget

1 组合框 QGroupBox

QGroupBox属于QWidget的一种,可以放置布局,也可以被放进布局中

一个组合框中只能有1个QRadioButton处于True状态

1.1 方法列表

QGroupBox类 说明
self=QGroupBox(parent) 创建实例
parent->父控件,使用布局时可省略
self.setTitle(title) 设置组合框标题
继承自QWidget类的方法
x, y, width, height, ... 几何类方法,详见窗口的几何数据
self.setLayout(layout) 设置组合框布局
layout->QLayout类

1.2 示例 进度条

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)

        hlayout = QHBoxLayout()
        self.pbar = QProgressBar()
        hlayout.addWidget(self.pbar)
        self.btn = QPushButton('开始')
        self.btn.clicked.connect(self.onStart)
        hlayout.addWidget(self.btn)

        self.timer = QTimer()
        self.timer.timeout.connect(self.update_func)
        self.step = 0

        parea = QGroupBox()
        parea.setLayout(hlayout)
        parea.setTitle('进度条')
        vlayout = QVBoxLayout()
        vlayout.addSpacing(120)
        vlayout.addWidget(parea)
        vlayout.addSpacing(120)
        self.setLayout(vlayout)

    def update_func(self):
        if self.step >= 100:
            self.timer.stop()
            return
        self.step = self.step + 1
        self.pbar.setValue(self.step)

    def onStart(self):
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        else:
            self.timer.start(100)
            self.btn.setText('Stop')

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

PyQt5第五部分-高级控件:QGroupBox, QTreeWidget, QListWidget, QTableWidget_第1张图片

2 树形窗口 QTreeWidget

QTreeView和QTreeWidget类最大的区别就是,QTreeView类可以使用操作系统提供的定制模式,比如文件系统盘的树列表

2.1 方法列表

QTreeWidget类 说明
self=QTreeWidget(parent) 创建实例
parent->父控件,使用布局时可省略
self.setColumnCount(n) 设置列数
=self.columnCount() 读取列数
self.setHeaderLabels(title) 设置列头
title->字符串列表
=self.currentItem() 返回当前选中的QTreeWidgetItem类
=self.invisibleRootItem() 生成一个不可见的根节点,返回QTreeWidgetItem类
self.clear() 清除所有节点
self.itemClicked.connect(fun) 单击触发槽函数,额外返回item参数
self.itemDoubleClicked.connect(fun) 双击触发槽函数,额外返回item参数
继承自QTreeView类的方法
self.expandAll() 展开所有节点
self.setColumnWidth(col, W) 将指定列的宽度设置为给定的值W
继承自QWidget类的方法
x, y, width, height, ... 几何类方法,详见窗口的几何数据
QTreeWidgetItem类 说明
self=QTreeWidgetItem(parent) 在窗口或节点下创建子节点
parent->QTreeWidget类QTreeWidgetItem类
self.setText(col, text) 设置节点第col列的文字
=self.text(col) 读取节点第col列的文字
self.addChild(child) 节点下添加子节点
child->QTreeWidgetItem类
self.removeChild(child) 节点下删除子节点
child->QTreeWidgetItem类
self.setCheckState(col, state) 设置指定列的选中状态,需要PyQt5.QtCore模块
Qt.Checked:节点选中
Qt.Unchecked:节点没有选中
=self.CheckState(col) 读取指定列的选中状态,需要PyQt5.QtCore模块
Qt.Checked:节点选中
Qt.Unchecked:节点没有选中
self.clicked.connect(fun) 单击触发槽函数
QTreeWidgetItemIterator类 说明
self=QTreeWidgetItemIterator(tree) 创建QTreeWidgetItemIterator类,注意这不是迭代器
self.value() 返回第一个节点的QTreeWidgetItem类,注意这不是迭代器
self.__iadd__(n) 返回后面第n个节点的QTreeWidgetItem类
self.__isub__(n) 返回前面第n个节点的QTreeWidgetItem类

2.2 示例 通过字典生成树形窗口并打印

要求将表格数据写为字典形式,通过字典生成树形窗口

QTreeWidget类必须要有根节点,可以通过QTreeWidgetItem()生成可见的根节点,也可以通过invisibleRootItem()生成不可见的根节点,建议使用不可见的根节点,可以发挥addChild()removeChild()的灵活性

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

grades = {
     '语文':{
     
              '小明':60,
              '小红':80
          },
          '数学':{
     
              '小明':90,
              '小红':70
          },
          '英语':{
     
              '小明':80,
              '小红':80
          },
}

class MyWindow(QTreeWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)
        self.setWindowTitle('树形窗口')

        self.setColumnCount(2)
        self.setColumnWidth(0, 200)
        self.setHeaderLabels(['学生', '成绩'])
        root = self.invisibleRootItem()
        self.generateTreeWidget(grades, root)
        self.expandAll()

    def generateTreeWidget(self, grades, root):
        if isinstance(grades, dict):
            for key in grades.keys():
                child = QTreeWidgetItem()
                child.setText(0, key)
                root.addChild(child)
                value = grades[key]
                self.generateTreeWidget(value, child)
        else:
            root.setText(1, str(grades))

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

PyQt5第五部分-高级控件:QGroupBox, QTreeWidget, QListWidget, QTableWidget_第2张图片

语文
小明 60
小红 80
数学
小明 90
小红 70
英语
小明 80
小红 80

3 列表窗口 QLisWidget

3.1 方法列表

QListWidget类 说明
self=QListWidget(parent) 创建实例
parent->父控件,使用布局时可省略
self.addItem(text) 在列表中添加条目
self.addItems(list) 在列表中添加多个条目
list->字符串组成的列表
self.insertItem(idx, text) 在列表中插入条目
=self.currentItem() 返回当前条目,返回QListWidgetItem类
self.sortItems() 按升序重新排列条目
self.clear() 清除所有节点
self.itemClicked.connect(fun) 单击触发槽函数,额外返回item参数
self.itemDoubleClicked.connect(fun) 双击触发槽函数,额外返回item参数
继承自QWidget类的方法
x, y, width, height, ... 几何类方法,详见窗口的几何数据
QListWidgetItem类 说明
self=QListWidgetItem(parent) 在窗口或节点下创建子节点
parent->QListWidget类
self.setText(text) 设置条目的文字
=self.text() 读取条目的文字

3.2 示例 单击触发槽函数

import sys
from PyQt5.QtWidgets import *

class MyWindow(QListWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)
        self.addItems(['数学', '英语', '语文'])
        self.itemClicked.connect(self.itemChoose)

    def itemChoose(self, item):
        QMessageBox.information(self, "ListWidget", "你选择了: " + item.text())


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

PyQt5第五部分-高级控件:QGroupBox, QTreeWidget, QListWidget, QTableWidget_第3张图片

4 表格窗口 QTableWidget

4.1 方法列表

QTableWidget类 说明
self=QTableWidget(row, col, parent) 创建实例,可直接设定行列数
parent->父控件,使用布局时可省略
self.setRowCount(n) 设置表格的行数
=self.rowCount() 读取表格的行数
self.setColumnCount(n) 设置表格的列数
=self.columnCount() 读取表格的列数
self.setHorizontalHeaderLabels(list) 设置表格的水平标签
self.setVerticalHeaderLabels(list) 设置表格的垂直标签
self.setEditTriggers() 设置表格是否可以编辑:
QAbstractItemView.NoEditTriggers: 不能对表格内容进行修改
QAbstractItemView.CurrentChanged: 能对单元格进行修改
QAbstractItemView.DoubleClicked: 双击单元格
QAbstractItemView.SelectedClicked: 单击已经选中的内容
QAbstractItemView.EditKeyPressed: 修改键按下修改键修改单元格
QAbstractItemView.AnyKeyPressed: 按任意键修改单元格
QAbstractItemView.AllEditTriggers31Editing: 包括以上所有条件
self.setSelectionBehavior() 设置表格的选择行为:
QAbstractItemView.SelectItems: 选中单个单元格
QAbstractItemView.SelectRows: 选中一行
QAbstractItemView.SelectColumns: 选中一列
self.setTextAlignment()() 设置文本对齐方式:
Qt.AlignLeft: 左侧对齐
Qt.AlignRight: 右侧对齐
Qt.AlignHCenter: 居中对齐
Qt.AlignJustify: 分散对齐
self.setItem(row, col, item) 设置单元格内容
item->QTableWidgetItem类
self.setCellWidget(row, col, widget) 设置单元格为控件
widget->控件类
self.clear() 清除所有节点
self.itemClicked.connect(fun) 单击触发槽函数,额外返回item参数
self.itemDoubleClicked.connect(fun) 双击触发槽函数,额外返回item参数
继承自QTableView类的方法
self.setColumnWidth(col, width) 设置单元格行的宽度
self.setRowHeigh(row, height) 设置单元格行的高度
self.setShowGrid(True) 显示网格
self.horizontalHeader() 返回QHeaderView类
self.verticalHeader() 返回QHeaderView类
继承自QWidget类的方法
x, y, width, height, ... 几何类方法,详见窗口的几何数据
QTableWidgetItem类 说明
self=QTableWidgetItem(parent) 在窗口或节点下创建子节点
parent->QTableWidget类
self.setText(text) 设置条目的文字
=self.text() 读取条目的文字
QHeaderView类 说明
self.setSectionResizeMode() 设置表头尺寸模式:
QHeaderView.Stretch: 自适应伸缩模式
self.setVisible(True) 表头显示

4.2 示例 QTableWidget的基本用法

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class MyWindow(QTableWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)

        self.setRowCount(4)
        self.setColumnCount(3)

        # 设置水平方向的表头标签与垂直方向上的表头标签,注意必须在初始化行列之后进行,否则,没有效果
        self.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])
        # 设置垂直方向的表头标签
        self.setVerticalHeaderLabels(['行1', '行2', '行3', '行4'])

        # 设置水平方向表格为自适应的伸缩模式
        self.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 将表格变为禁止编辑
        self.setEditTriggers(QAbstractItemView.NoEditTriggers)

        # 设置表格整行选中
        self.setSelectionBehavior(QAbstractItemView.SelectRows)

        # 在单元格内放置控件
        comBox=QComboBox()
        comBox.addItems(['男','女'])
        comBox.addItem('未知')
        comBox.setStyleSheet('QComboBox{margin:3px}')
        self.setCellWidget(0,1,comBox)

        searchBtn=QPushButton('修改')
        searchBtn.setDown(True)
        searchBtn.setStyleSheet('QPushButton{margin:3px}')
        self.setCellWidget(0,2,searchBtn)

        # 添加数据
        newItem = QTableWidgetItem('张三')
        self.setItem(0, 0, newItem)
        newItem = QTableWidgetItem('男')
        self.setItem(0, 1, newItem)
        newItem = QTableWidgetItem('160')
        self.setItem(0, 2, newItem)

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

PyQt5第五部分-高级控件:QGroupBox, QTreeWidget, QListWidget, QTableWidget_第4张图片
>>返回Python系列文章目录<<

你可能感兴趣的:(Python,pyqt,gui,python)