在 PyQt GUI 中集成 QPainter

2023-12-13

我试图在一个布局中使用 QPainter 制作的对象以及 PyQt 的本机小部件,但这样做很困难。

我尝试过使用addWidget()将其添加到布局中但没有运气。

class window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(600, 500)
        self.setWindowTitle('GUI 2.0')

        #LCD
        self.lcd = QLCDNumber()
        self.lcd.setFixedHeight(100)

        #Slider
        self.slider = QSlider(Qt.Horizontal)
        self.slider.setMaximum(40)
        self.slider.setMinimum(0)
        self.slider.valueChanged.connect(self.progress)

        #Push button
        pb = QPushButton('Button', self)
        pb.clicked.connect(self.button)

        #Progress Bar
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)
        self.pbar.setTextVisible(False)

        #Qpainter
        painter = QPainter()
        painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
        painter.setBrush(QBrush(Qt.green, Qt.DiagCrossPattern))
        painter.drawRect(100, 15, 400,200)

        #Grid Layout 
        layout = QGridLayout()
        layout.addWidget(self.lcd, 1, 1)
        layout.addWidget(self.slider, 2, 1)
        layout.addWidget(pb, 2, 2)
        layout.addWidget(self.pbar, 0, 1)
        layout.addWidget(painter) # doesn't work!

        self.setLayout(layout)

我的目标是这样的,滑块最终将改变水箱中的水位,按钮将重置滑块值,从而清空水箱:

Water Tank

Water Tank

而我有这样的事情:

Self-Made

如何将画家对象添加到布局中?


QPainter 不是一个小部件,而仅在设备上绘制(QWidget、QImage、QPixmap 等),因此在您的情况下,您必须创建一个自定义小部件,其中在 PaintEvent 方法中绘制坦克

from PyQt5 import QtCore, QtGui, QtWidgets


class TankWidget(QtWidgets.QWidget):
    progressChanged = QtCore.pyqtSignal(float)

    def __init__(self, parent=None):
        super().__init__(parent)

        self._progress = 0.0

    @QtCore.pyqtProperty(float, notify=progressChanged)
    def progress(self):
        return self._progress

    @progress.setter
    def progress(self, p):
        if 0 <= p <= 1.0:
            self._progress = p
            self.progressChanged.emit(p)
            self.update()

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        height = self.progress * self.height()

        r = QtCore.QRect(0, self.height() - height, self.width(), height)
        painter.fillRect(r, QtGui.QBrush(QtCore.Qt.blue))
        pen = QtGui.QPen(QtGui.QColor("red"), 10)
        painter.setPen(pen)
        painter.drawRect(self.rect())

    def sizeHint(self):
        return QtCore.QSize(100, 100)


class Widget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.resize(600, 500)
        self.setWindowTitle("GUI 2.0")

        self.tank = TankWidget()
        self.progressbar = QtWidgets.QProgressBar()
        self.lcd = QtWidgets.QLCDNumber()
        self.lcd.setFixedHeight(100)
        self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal, maximum=101)
        self.button = QtWidgets.QPushButton("Button")

        self.slider.valueChanged.connect(self.on_value_changed)

        lay = QtWidgets.QGridLayout(self)
        lay.addWidget(self.tank, 0, 0, 2, 1)
        lay.addWidget(QtWidgets.QLabel("Tank", alignment=QtCore.Qt.AlignCenter), 2, 0)
        lay.addWidget(self.progressbar, 0, 1)
        lay.addWidget(self.lcd, 1, 1)
        lay.addWidget(self.slider, 2, 1)
        lay.addWidget(
            QtWidgets.QLabel(
                pixmap=QtGui.QPixmap("warning.png"), alignment=QtCore.Qt.AlignCenter
            ),
            0,
            2,
            2,
            1,
        )
        lay.addWidget(self.button, 2, 2)

        self.setFixedHeight(self.sizeHint().height())

        self.slider.setValue(40)

    @QtCore.pyqtSlot()
    def on_value_changed(self):
        progress = self.slider.value() * 1.0 / self.slider.maximum()
        self.tank.progress = progress
        self.progressbar.setValue(self.slider.value())
        self.lcd.display(self.slider.value())


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

enter image description here

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

在 PyQt GUI 中集成 QPainter 的相关文章

  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 当单词以“|”分隔时如何读取文件(埃因霍温)?

    在Python中 我有一个文件 其中的单词由 例如 city state zipcode 我的文件阅读器无法区分单词 另外 我希望我的文件阅读器从第 2 行而不是第 1 行开始 如何让我的文件阅读器分隔单词 import os import
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 如何在 robobrowser-python 中发出 POST 请求

    http robobrowser readthedocs org en latest api html http robobrowser readthedocs org en latest api html 我正在尝试使用 APIbrows
  • Python 通过从现有 csv 文件中过滤选定的行来写入新的 csv 文件

    只是一个问题 我试图将 csv 文件中的选定行写入新的 csv 文件 但出现错误 我试图读取的 test csv 文件是这样的 两列 2013 9 1 2013 10 2 2013 11 3 2013 12 4 2014 1 5 2014
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name

随机推荐

  • 在 iPhone Web 应用程序中禁用滚动?

    有什么方法可以完全禁用 iPhone Web 应用程序中的网页滚动吗 我已经尝试了谷歌上发布的许多内容 但似乎都不起作用 这是我当前的标题设置 document body addEventListener touchmove functio
  • 计算 R 中列表的出现次数

    我有一个大约 100 000 次一起订购的项目的列表 我已将其粘贴到一列中 以便我可以计算每个组合出现的次数 4845 Curly Fries California Burger 1 4846 French Fries California
  • 在文本视图中显示日语而不是中文

    在textview中显示日文文本时 android默认使用中文字体 显示错误的字符 示例here 将语言环境设置为日语可以在模拟器上使用 但在我的 Galaxy s3 上不起作用 可能是因为它不支持日语 还有其他解决方案是以编程方式从资产设
  • 调整 BufferedImages 的大小并将其存储到 JPG 图像黑色背景的文件结果中

    我有以下代码 import java awt Graphics2D import java awt Image import java awt image BufferedImage import java io File import j
  • 使用 class 而不是 id 的 keyup 事件

    如果我有 2 个文本框 不使用 id 如何确定哪个文本框正在触发 keyup 事件 由于各种原因 我需要使用类而不是 id 其中两个文本框的类名相同 事实上 我可以在屏幕上多次显示具有相同类名的相同文本框 HTML 看起来像这样 div c
  • 如何使用和解释 MPI-IO 错误代码?

    include
  • 从android中的视频文件中提取帧

    我正在尝试从 android 中的视频文件中提取帧 我已经搜索了很多 但找不到任何线索 我们有什么办法可以做到这一点吗 有人可以帮我解决这个问题吗 虽然我迟到了 但是 使用名为 FFmpegMediaMetadataRetriever 的库
  • 使用 XDocument.Save() 写入 XML 时如何保留特殊字符?

    我的源 XML 中的版权字符为 x00A9 使用以下代码编写 XML 时 var stringWriter new StringWriter segmentDoc Save stringWriter Console WriteLine st
  • ASP.NET MVC 3 应用程序,BCrypt.CheckPassword 失败

    我正在致力于在 ASP NET MVC 3 应用程序中实现安全性 并使用 BCrypt 实现在这里找到处理密码的加密和验证 用户注册屏幕对用户提供的密码进行了很好的加密 并将散列密码保存到数据库中 我在登录页面上遇到密码验证问题 但我似乎不
  • 永远在后台运行服务 - Android

    我创建了一个Service在我的android应用程序中自动启动BOOT COMPLETE通过BroadcastReceiver 这工作得很好 但是这个服务执行我在里面定义的任务onCreate 方法 仅一次 另一方面 我想运行Servic
  • C# 中的命名空间和 Java 中的包的区别

    C 中的命名空间和 Java 中的包之间有什么区别 在使用方面 From http www javacamp org javavscsharp namespace html Java 包用于组织文件或公共类型以避免类型冲突 包结构可以映射到
  • java.lang.UnsatisfiedLinkError:java.library.path中没有xuggle-xuggler

    我正在使用 Ubuntu 11 04 和 Eclipse 我成功安装了 Xuggler 我在常见问题解答中检查了环境变量以及与 linux 相关的所有内容 http wiki xuggle comFrequently Asked Quest
  • 在 SystemVerilog 中 fork join_none 后仅等待一些线程完成

    在 SystemVerilog 中 我需要等待在 fork join none 结构内执行的一些线程完成 但是在另一个 fork join none 结构中还有另一个永远不会结束的进程 我的代码如下所示 fork process that
  • 想要生成自定义唯一密钥并同时处理多个请求

    我在 sql 数据库服务器中有一个如下表 其中包含 varchar 列 并使用 linq to 实体以编程方式将其维护为自定义唯一键 我正在从数据库中提取数据并进行拆分 增量和保存 但我想知道当多个请求同时出现时会发生什么 这可能会导致我的
  • ASP.NET Web 表单中的 jQuery 自动完成功能?

    有人使用 jQuery 通过 ASP NET Web 表单填充文本框上的自动完成列表吗 如果可以的话 谁能推荐一个好的方法吗 从我到目前为止的阅读来看 似乎大多数人都使用分隔列表而不是 JSON 来带回项目 我愿意接受任何能让我快速启动并运
  • BETWEEN 与日期实际上在 SQL SERVER 2008 中有效吗

    根据cdonner 在他的回答中here和他的blog 他声称 BETWEEN 与日期会产生不一致的结果 来自他的博客 select case when 9 1 08 between 9 1 08 and 9 15 08 then in e
  • 如何在 MySQL 中按 SUM() 进行排序?

    我有一个表 ID名称c counts f counts 我想按以下方式订购所有记录sum c counts f counts 但这不起作用 SELECT FROM table ORDER BY sum c counts f counts L
  • 如何获取特定命名空间内的所有类名?

    我想获取命名空间内的所有类 我有这样的事情 File MyClass1 php namespace MyNamespace class MyClass1 File MyClass2 php namespace MyNamespace cla
  • 注册表单唯一电子邮件

    我在用django inspectional registration这是基于官方的django registration 我想确保用户电子邮件字段的唯一性 但我在使用时 url r register RegistrationView as
  • 在 PyQt GUI 中集成 QPainter

    我试图在一个布局中使用 QPainter 制作的对象以及 PyQt 的本机小部件 但这样做很困难 我尝试过使用addWidget 将其添加到布局中但没有运气 class window QWidget def init self super