PyQt入门(8)-常用控件(下)

2023-10-26

目录

1、QListWidget

2、QTreeWidget 

 3、QTableWidget


1、QListWidget

QListWidget是一个QListView的便捷类,提供一个列表视图,大数据量的情况下QListView确实更加灵活,效率更高。但是在少量数据的时候,因为易用性,QListWidget也是一个不错的选择。

QListWidget的每个数据项都是一个QListWidgetItem。

更多用法见:QListWidget详细说明

下面是一个QListWidget的简单用法:

self.list_widget = QListWidget()
self.list_widget.addItem("数据1")
self.list_widget.addItem("数据2")
self.list_widget.addItem("数据3")
self.list_widget.addItem("数据4")
self.main_layout.addWidget(self.list_widget)

再结合前面的知识实现一个简易的目录浏览器:

import os

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLineEdit, QPushButton,  \
    QListWidgetItem, QListWidget, QHBoxLayout


class ButtonWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('测试button')
        self.resize(400, 300)

        self.layout_main = QVBoxLayout()

        self.layout_header = QHBoxLayout()
        self.le_folder_addr = QLineEdit()
        self.btn_view = QPushButton("浏览")
        # 信号与槽
        self.btn_view.clicked.connect(self.view_folder)
        self.layout_header.addWidget(self.le_folder_addr, stretch=1)
        self.layout_header.addWidget(self.btn_view)
        self.layout_main.addLayout(self.layout_header)

        self.list_widget = QListWidget()
        self.layout_main.addWidget(self.list_widget)

        self.setLayout(self.layout_main)

    def view_folder(self):
        for entry in os.scandir(self.le_folder_addr.text()):
            if entry.is_dir():
                self.list_widget.addItem(QListWidgetItem(QIcon('icons/folder.png'), entry.name))
            else:
                self.list_widget.addItem(QListWidgetItem(QIcon('icons/file.png'), entry.name))

 

2、QTreeWidget 

QTreeWidget是QTreeView的便捷类,提供一个树形视图。QTreeWidget的每个结点都是一个QTreeWidgetItem。直接挂靠在QTreeWidget下的结点是top结点,top结点没有父结点,其他结点在代码上和QTreeWidget已经没有关系了,只需要指定父结点即可,我们可以从QTreeWidgetItem详细说明里面看到QTreeWidgetItem的构造函数大多要指定一个parent。

QTreeWidget使用addTopLevelItem()来添加top结点。

QTreeWidget有columns的概念,我们可以用windows文件夹的详细信息浏览方式为例来理解:

QTreeWidget在第一列展示树形视图,我们可以添加2、3、4 ... 列来展示结点的更多属性。

QTreeWidget还可以设置header信息,更多用法参见:QTreeWidget详细说明

还是上面的简易文件夹浏览器,我们希望能够进一步浏览子目录,并且要体现层级关系,可以用QTreeWidget来改写上面的代码:

class ButtonWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('测试button')
        self.resize(400, 300)

        self.layout_main = QVBoxLayout()

        self.layout_header = QHBoxLayout()
        self.le_folder_addr = QLineEdit()
        self.btn_view = QPushButton("浏览")
        self.btn_view.clicked.connect(self.view_folder)
        self.layout_header.addWidget(self.le_folder_addr, stretch=1)
        self.layout_header.addWidget(self.btn_view)
        self.layout_main.addLayout(self.layout_header)

        # 改用QTreeWidget来展示,树形才能展示目录的层级关系
        self.tree_widget = QTreeWidget()
        # 设置标题为 名称
        self.tree_widget.setHeaderLabel("名称")

        self.layout_main.addWidget(self.tree_widget)

        self.setLayout(self.layout_main)

    def view_folder(self):
        for entry in os.scandir(self.le_folder_addr.text()):
            if entry.is_dir():
                temp = QTreeWidgetItem([entry.name])
                temp.setIcon(0, QIcon('icons/folder.png'))
                # 添加top结点
                self.tree_widget.addTopLevelItem(temp)
                # 子目录下的结点以此top结点为root形成一颗结点树
                self.digui_view(os.path.join(self.le_folder_addr.text(), entry.name), temp)
            else:
                temp = QTreeWidgetItem([entry.name])
                temp.setIcon(0, QIcon('icons/file.png'))
                self.tree_widget.addTopLevelItem(temp)

    def digui_view(self, name, parent):
        for entry in os.scandir(name):
            if entry.is_dir():
                # 非top结点只需指定父结点即可
                temp = QTreeWidgetItem(parent, [entry.name])
                temp.setIcon(0, QIcon('icons/folder.png'))
                self.digui_view(os.path.join(name, entry.name), temp)
            else:
                temp = QTreeWidgetItem(parent, [entry.name])
                temp.setIcon(0, QIcon('icons/file.png'))

这样一来效果就好多了,现在我们想展示每个文件的修改日期,再进一步修改代码:

def get_f_time(timestamp):
    return datetime.datetime.fromtimestamp(timestamp).strftime("%Y/%m/%d %H:%M")


class ButtonWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('测试button')
        self.resize(400, 300)

        self.layout_main = QVBoxLayout()

        self.layout_header = QHBoxLayout()
        self.le_folder_addr = QLineEdit()
        self.btn_view = QPushButton("浏览")
        self.btn_view.clicked.connect(self.view_folder)
        self.layout_header.addWidget(self.le_folder_addr, stretch=1)
        self.layout_header.addWidget(self.btn_view)
        self.layout_main.addLayout(self.layout_header)

        self.tree_widget = QTreeWidget()
        # 设置两列
        self.tree_widget.setColumnCount(2)
        # 两列的标题
        self.tree_widget.setHeaderLabels(["名称", "修改日期"])

        self.layout_main.addWidget(self.tree_widget)

        self.setLayout(self.layout_main)

    def view_folder(self):
        for entry in os.scandir(self.le_folder_addr.text()):
            if entry.is_dir():
                # 这就是为什么QTreeWidgetItem的构造函数都是传入字符串列表
                temp = QTreeWidgetItem([entry.name, get_f_time(entry.stat().st_mtime)])
                temp.setIcon(0, QIcon('icons/folder.png'))
                self.tree_widget.addTopLevelItem(temp)
                self.digui_view(os.path.join(self.le_folder_addr.text(), entry.name), temp)
            else:
                temp = QTreeWidgetItem([entry.name, get_f_time(entry.stat().st_mtime)])
                temp.setIcon(0, QIcon('icons/file.png'))
                self.tree_widget.addTopLevelItem(temp)

    def digui_view(self, name, parent):
        for entry in os.scandir(name):
            if entry.is_dir():
                temp = QTreeWidgetItem(parent, [entry.name, get_f_time(entry.stat().st_mtime)])
                temp.setIcon(0, QIcon('icons/folder.png'))
                self.digui_view(os.path.join(name, entry.name), temp)
            else:
                temp = QTreeWidgetItem(parent, [entry.name, get_f_time(entry.stat().st_mtime)])
                temp.setIcon(0, QIcon('icons/file.png'))

 3、QTableWidget

QTableWidget是QTableView的便捷类,提供一个表格视图。表格有行列之说,QTableWidget的行列数可以在实例化的时候指定,也可以通过setRowCount()setColumnCount()来指定,QTableWidget的每个单元格都是一个QTableWidgetItem,通过setItem()来设置单元格。更多用法见:QTableWidget详细说明

class ButtonWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('测试button')
        self.resize(400, 300)

        self.layout_main = QVBoxLayout()

        # 新建一个QTableWidget并指定5行3列
        self.table_widget = QTableWidget(5, 3)
        # 水平方向上的标题自然就是列标题
        self.table_widget.setHorizontalHeaderLabels(["数学", "语文", "英语"])
        # 行标题
        self.table_widget.setVerticalHeaderLabels(["张三", "李四", "王五", "赵六", "吴起"])

        # 设置item,需要同时指定行列索引,没有捷径,只能一个个单元格的设置
        self.table_widget.setItem(0, 0, QTableWidgetItem("78"))
        self.table_widget.setItem(1, 0, QTableWidgetItem("89"))
        self.table_widget.setItem(2, 0, QTableWidgetItem("56"))
        self.table_widget.setItem(3, 0, QTableWidgetItem("77"))
        self.table_widget.setItem(4, 0, QTableWidgetItem("99"))

        self.layout_main.addWidget(self.table_widget)

        self.setLayout(self.layout_main)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt入门(8)-常用控件(下) 的相关文章

  • 无法使用 QWebEngineView 渲染网页

    我一直在尝试将网页渲染到 PyQt5 中的小部件上 这些是我的设置 PyQt 5 15 4 PyQtWebEngine 5 15 4 PyQt5 工具 5 15 4 2 我正在尝试渲染一些基本网站 例如 google com 但我面临着一个
  • PyQt:运行时错误:包装的 C/C++ 对象已被删除

    如果我运行这段代码 usr local bin python3 import sys from PyQt4 QtCore import from PyQt4 QtGui import class Window QMainWindow def
  • PyQt QListWidget 自定义项

    我如何创建一个 QListWidgetItem 它下面有 1 个图像和 2 个标签 字符串 并且支持 css 这是我尝试过的最后一件事 class CustomListWidgetItem QListWidgetItem QLabel de
  • PyCharm 3.0 找不到 PyQt5

    我安装了 Python 3 3 2 x86 和 x64 版本 并在其上安装了 PyQt5 1 Recently I installed PyCharm 3 0 Community Edition and configured to work
  • 如何从接口获取物理接口IP地址

    到目前为止我使用 PyQt 类所做的事情 all Addresses QNetworkInterface allAddresses list of QHostAddress for addr in all Addresses print a
  • Python 和 PyQt 中的线程错误

    我注意到当函数setModel http doc trolltech com 4 0 qabstractitemview html setModel在并行线程中执行 我尝试了 threading Timer 或 threading thre
  • Python 全局对象变量

    我想使用一个已从独立模块在类内部实例化的对象 我试图通过使对象引用全局来做到这一点 我想我想利用当前的对象而不是创建一个新的对象 假设我在模块文件中有这段代码 import moduleFile class A def checkAdmin
  • 使每个选项卡具有相同的宽度并且可扩展

    我正在尝试实现类似浏览器中的选项卡之类的功能 所有选项卡必须具有相同的宽度并且可以扩展 因此当选项卡很多时 它们需要调整大小并适合窗口 就像 Chrome 或 Firefox 所做的那样 问题 如果某个选项卡的文本多于其他选项卡 则该选项卡
  • PyQt 4 UI 冻结

    下面的程序应该只是累加和 int 并在标签中显示其值 但过了一会儿 GUI 停止工作 而循环继续 from PyQt4 import QtGui QtCore import sys class main window QtGui QWidg
  • 如何使用 QPainterPath 裁剪图像而不保存图像的其余部分

    我有一个 QPainterPath 我想裁剪一个 QPixmap 图像 这段代码对我有用 但我想使用 PyQt5 内置功能 就像没有 numpy 的 mask read image as RGB and add alpha transpar
  • 如何在 PyQt 中的自定义 Qt.ItemFlags 实例中找到特定的 Qt.ItemFlag 出现?

    我有一个QTreeWidget http www riverbankcomputing com static Docs PyQt4 html qtreewidget html with QTreeWidgetItem http www ri
  • 将 Matplotlib 图作为 QGraphicsItem/放入 QGraphicsView

    因此 我有一个非常基本的绘图布局 如下所述 为简洁起见 更改了 x 和 y 值 import matplotlib pyplot as plt from matplotlib figure import Figure import nump
  • 使用 PyQT 逐帧加载 opencv 视频

    我正在尝试加载一个 mat 文件 具有被跟踪对象的位置坐标 并加载一个视频文件 为了加载视频文件 我使用 opencv 我制作了一个 GUI 来加载它们 一旦有人按下开始按钮 视频就会开始播放 暂停会停止播放 这是它的 GUI 这是我遇到的
  • 使用 python3.5 将 Arduino 的实时数据链接到 pyqt5 的 LCDNumber

    我对制作 GUI 还很陌生 我为一个项目设计了一个项目 我希望在数据从 Arduino 传入时更新 LCD 我正在使用 pyqt5 来转换我的 Qtdesigner GUI 问题是我不知道如何将传入数据链接到 GUI 目前 我有一个程序可以
  • 为 python GUI 应用程序授予 root 权限以在 ubuntu 中运行命令

    现在 我有一个 python GUI 应用程序 需要使用 sudo 权限运行命令 如下所示 import commands iStat askpassPath commands getstatusoutput which ssh askpa
  • PyQt:如何正确显示图像?

    我想在 pyqt 中显示图像 所以我使用了标签和像素图选项 以及缩放内容 但图像扭曲了 我应该使用另一个小部件还是做其他事情 谢谢 这是代码 from PyQt4 import QtCore QtGui self label setPixm
  • 编辑表时关闭 PyQt 事件循环

    我正在使用 PyQt 开发 GUI GUI 有一个 qListWidget 一个 qTableWidget 和一个用 Mayavi 实现的绘图 该列表指的是绘制的形状 例如圆柱体和圆锥体 当在列表中选择形状时 我希望将形状的属性加载到表中
  • 如何获取对话框/窗口的背景颜色?

    如何获取 RGB 格式的对话框 窗口的背景颜色 Use QWidget palette访问小部件的调色板和QPalette color获取背景颜色 color widget palette color QPalette Background
  • 如何在 Python Qt 应用程序中使用 KDE Okular 的文档视图小部件?

    我正在 Linux 上使用 Qt 4 8 和 PyQt 用 Python 3 4 编写桌面应用程序 有没有办法将 Okular 的 pdf 查看功能作为小部件使用 导入 如果是 怎么办 这对我有用 import sys from PyKDE
  • 从线程接收数据后pyqt主窗口不断崩溃

    我有一个 QMainWindow 启动 QThread 并等待来自网络的数据 当收到任何数据时更新 UI 问题是 它有时会崩溃 有时不会 我所做的就是启动它并等待数据 这是线程类 class ListenerThread QtCore QT

随机推荐

  • 基于Protobuf协议的Dubbo与SpringBoot的结合

    文章目录 工程概况 父pom dubbo provider 通过proto3定义服务 打包发布服务 dubbo provider service实现服务 dubbo provider web提供服务 dubbo consumer dubbo
  • 依赖注入和控制反转的理解,写的太好了

    学习过Spring框架的人一定都会听过Spring的IoC 控制反转 DI 依赖注入 这两个概念 对于初学Spring的人来说 总觉得IoC DI这两个概念是模糊不清的 是很难理解的 今天和大家分享网上的一些技术大牛们对Spring框架的I
  • 互联网产品运作模式详解

    互联网产品运作模式详解 https www infoq cn article 3EVku39xVhJYs7ba9uk7 本文主要总结下移动互联网产品的市场运作模式 因为本身我是技术出身 对运作模式中的开发体系这 块相对熟悉 但是其他阶段也是
  • js: for in 循环对象

    var peopleObj man 2 2 2 woman 1 1 1 womanDoctor 100 100 100 for const prop in peopleObj if peopleObj hasOwnProperty prop
  • java将图片转为base64后出现的一些问题

    因为需要对接第三方接口 需要将图片转换为base64编码传参 手动转换base64使用postman完全是OK的 结果java中转换出来死活不行 p 将文件转成base64 字符串 p param path 文件路径 return thro
  • Linux下ps命令实现

    include
  • 思科实验-生成树协议STP

    生成树协议 英语 Spanning Tree Protocol STP 是一种工作在OSI网络模型中的第二层 数据链路层 的通信协议 基本应用是防止交换机冗余链路产生的环路 用于确保以太网中无环路的逻辑拓扑结构 从而避免了广播风暴 大量占用
  • vivado2021.1安装

    首先需要在官网注册一个账号 安装软件时需要使用 账号注册连接 xilink账号注册 vivado下载链接 xilink官网下载 使用官网下载需要注册账号 下载免费 vivado阿里云盘下载 vivado licence阿里云盘下载 官网下载
  • QStringLiteral(str)

    在看项目代码的时候 总会看到下面这种情况 QString str QStringLiteral 123rt QString用QStringLiteral str 来初始化 有点好奇 就查了下 记录一下 这是用QStringLiteral初始
  • Java:记录一下第一次面试经历(新希望六和)

    记录一下本菜鸡两个月前第一次面试新希望六合这家公司 那时的我很多都回答不上来 非常尴尬 不过这第一次面试经历也算是给足了我动力继续努力 记录一下这个第一次面试的题目 也算是记录一下那时候的我 做过什么样的项目 简单介绍一下你的项目 项目的整
  • 客户端请求的端口号是什么?

    我们知道服务器端是要指定和开放端口号的 比如 web 服务 http 请求的 80 https 的 443 端口 都要开放 否则无法请求成功 我们知道通信是由两端组成的 既然服务器需要指定端口 那么客户端呢 比方说我用 chrome 浏览器
  • 模型微调技术

    模型微调 一 迁移学习中的常见技巧 微调 fine tuning 1 1 概念 1 2 步骤 1 3 训练 1 4 实现 一 迁移学习中的常见技巧 微调 fine tuning 1 1 概念 将在大数据集上训练得到的weights作为特定任
  • java常用第三方类库

    几乎每个程序员都知道要 避免重复发明轮子 的道理 尽可能使用那些优秀的第三方框架或库 但当真正进入开发 时 我却经常发现他们有时并不知道那些轮子在哪里 最近 我在业余时间带几个年轻的程序员一起做了一个很小的商业项目 而在一起开发的过程中 我
  • Java使用Collections.reverse()反转一个List

    public class Demo public static void main String args ArrayList
  • 2023年CPU&GPU天梯图(最新版)

    在当今计算机世界 CPU GPU和显卡的性能成为了衡量计算机性能的重要指标 今天深入了解CPU GPU和显卡天梯图 首先 CPU作为计算机的大脑 负责处理各种任务 它的性能主要由核心数 主频和缓存大小决定 其中 核心数和主频决定了CPU的处
  • 我的2016--"狗血"

    偶然看到了CSDN的 我的2016 主题征文活动 突然感慨一番 今年又快结束了 而我这一年的经历 可以浓缩为两个字 狗血 然而 我能用上如此不羁的词汇 并未能掩盖我木讷的内心 这才真的是狗血 感觉像在梦游 走了好远的路 一睁开眼睛却还在原地
  • Qt5和Qt6在线安装的问题

    在线安装我的梯子怎么都安装不快 如果只是时间长也行啊 但是经常蹦出来一个 下载xxx无响应 你还得去盯着它 不然就给你自动退出了 着实有些烦人 得下载14个小时 有一个方法是更换镜像源 也就是 在cmd命令行如下执行 qt unified
  • 第一个CUDA程序-addVector

    本文主要通过对两个浮点数组中的数据进行相加 并将其结果放入第三个数组中 其算法分别在CPU GPU上分别执行 并比较了所需时间 强烈感受到GPU的并行计算能力 这里 每个数组的元素大小为30000000个 一 实现代码 cpp view p
  • 对比学习simSiam(一)--Exploring Simple Siamese Representation Learning总体理解

    1 从名字上把握 sim是我们熟知的相似的那个单词 这个Siam是孪生的意思 这里使用这个来命名应该是为了指出孪生的重要性 这里的核心其实是在提出一个思想 对比学习这种由孪生网络结构构成的无监督学习的关键其实是孪生网络 两个网络有其中一方停
  • PyQt入门(8)-常用控件(下)

    目录 1 QListWidget 2 QTreeWidget 3 QTableWidget 1 QListWidget QListWidget是一个QListView的便捷类 提供一个列表视图 大数据量的情况下QListView确实更加灵活