当前位置: 代码迷 >> 综合 >> PyQt5第五部分-高级控件:QGroupBox, QTreeWidget, QListWidget, QTableWidget
  详细解决方案

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

热度:75   发布时间:2024-02-29 12:27:18.0

这里写目录标题

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

0 前言

1 组合框 QGroupBox

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

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

1.1 方法列表 QGroupBox

QGroupBox类 说明
self=QGroupBox(parent) 创建实例
parent->父控件,使用布局时可省略
self.setLayout(layout) 设置组合框布局
layout->QLayout类
self.setTitle(title) 设置组合框标题

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 = 0parea = 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()returnself.step = self.step + 1self.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_())

在这里插入图片描述

2 树形窗口 QTreeWidget

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

2.1 方法列表

QTreeWidget类 说明
self=QTreeWidget(parent) 创建实例
parent->父控件,使用布局时可省略
self.setColumnCount(n) 设置列数
=self.columnCount() 读取列数
self.setHeaderLabels(title) 设置列头
title->字符串列表
self.setColumnWidth(col, W) 将指定列的宽度设置为给定的值W
self.expandAll() 展开所有节点
=self.currentItem() 返回当前选中的QTreeWidgetItem类
=self.invisibleRootItem() 生成一个不可见的根节点,返回QTreeWidgetItem类
self.clear() 清除所有节点
self.itemClicked.connect(fun) 单击触发槽函数,额外返回item参数
self.itemDoubleClicked.connect(fun) 双击触发槽函数,额外返回item参数
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_())

在这里插入图片描述

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

2.3 示例 两个树形窗口选择项目

import sys
from PyQt5.QtWidgets import *
from PyQt5.Qt import *grades = {
    '语文': 70,'数学': 87,'英语': 92,'物理': 86,'化学': 78
}class MyWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.move(500, 400)self.setFixedSize(600, 300)self.setWindowTitle('树形窗口')layout = QHBoxLayout()self.setLayout(layout)self.tree1 = QTreeWidget()layout.addWidget(self.tree1)self.tree1.setColumnCount(2)self.tree1.setHeaderLabels(['学科', '成绩'])root = self.tree1.invisibleRootItem()self.tree1.root = self.tree1.invisibleRootItem()self.generateTreeWidget(grades, root)self.tree1.clicked.connect(self.addItem)self.tree2 = QTreeWidget()layout.addWidget(self.tree2)self.tree2.setColumnCount(2)self.tree2.setHeaderLabels(['选中的学科', '成绩'])self.tree2.root = self.tree2.invisibleRootItem()self.tree2.clicked.connect(self.removeItem)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))def addItem(self):item = self.tree1.currentItem()item1 = QTreeWidgetItem()item1.setText(0, item.text(0))item1.setText(1, item.text(1))self.tree2.root.addChild(item1)def removeItem(self):item = self.tree2.currentItem()self.tree2.root.removeChild(item)if __name__ == '__main__':app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec_())

在这里插入图片描述

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参数
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_())

在这里插入图片描述

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.setShowGrid(True) 显示网格
self.setColumnWidth(col, width) 设置单元格行的宽度
self.setRowHeigh(row, height) 设置单元格行的高度
self.setItem(row, col, item) 设置单元格内容
item->QTableWidgetItem类
self.setCellWidget(row, col, widget) 设置单元格为控件
widget->控件类
self.horizontalHeader() 返回QHeaderView类
self.verticalHeader() 返回QHeaderView类
self.clear() 清除所有节点
self.itemClicked.connect(fun) 单击触发槽函数,额外返回item参数
self.itemDoubleClicked.connect(fun) 双击触发槽函数,额外返回item参数
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_())

在这里插入图片描述

  相关解决方案