如何将通知号码添加到按钮图标?

2024-01-02

我正在尝试使用 PyQt5 制作 GUI。它将有一个带有图标的通知按钮。我想在图标上添加一个带有通知数量的小气泡。

如果无法提供数字,我想使用红点作为备用方法。 但是我应该如何跟踪新通知(如通知侦听器)并在窗口运行时更改图标?

我一直在谷歌上搜索这个问题,但只出现了移动开发内容和非 PyQt5 相关的结果。

预期结果:假设我们有一个列表。当新项目添加到列表中时,按钮的图标会自动更改。然后,当单击该按钮时,图标将变回来。


一个可能的解决方案是创建一个小部件,其布局中放置一个 QToolButton,并在右上角放置一个带有 QPixmap 的 QLabel,该 QPixmap 的编号为

from PyQt5 import QtCore, QtGui, QtWidgets


def create_pixmap(point, radius=64):
    rect = QtCore.QRect(QtCore.QPoint(), 2 * radius * QtCore.QSize(1, 1))
    pixmap = QtGui.QPixmap(rect.size())
    rect.adjust(1, 1, -1, -1)
    pixmap.fill(QtCore.Qt.transparent)
    painter = QtGui.QPainter(pixmap)
    painter.setRenderHints(
        QtGui.QPainter.Antialiasing | QtGui.QPainter.TextAntialiasing
    )
    pen = painter.pen()
    painter.setPen(QtCore.Qt.NoPen)

    gradient = QtGui.QLinearGradient()
    gradient.setColorAt(1, QtGui.QColor("#FD6684"))
    gradient.setColorAt(0, QtGui.QColor("#E0253F"))
    gradient.setStart(0, rect.height())
    gradient.setFinalStop(0, 0)

    painter.setBrush(QtGui.QBrush(gradient))
    painter.drawEllipse(rect)
    painter.setPen(pen)
    painter.drawText(rect, QtCore.Qt.AlignCenter, str(point))
    painter.end()
    return pixmap


class NotificationButton(QtWidgets.QWidget):
    scoreChanged = QtCore.pyqtSignal(int)

    def __init__(self, score=0, icon=QtGui.QIcon(), radius=12, parent=None):
        super(NotificationButton, self).__init__(parent)

        self.m_score = score
        self.m_radius = radius

        self.setContentsMargins(0, self.m_radius, self.m_radius, 0)
        self.m_button = QtWidgets.QToolButton(clicked=self.clear)
        self.m_button.setContentsMargins(0, 0, 0, 0)
        self.m_button.setIcon(icon)
        self.m_button.setIconSize(QtCore.QSize(18, 18))
        lay = QtWidgets.QVBoxLayout(self)
        lay.setContentsMargins(0, 0, 0, 0)
        lay.addWidget(self.m_button)
        self.m_label = QtWidgets.QLabel(self)
        self.m_label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
        self.m_label.raise_()
        self.setSizePolicy(self.m_button.sizePolicy())
        self.update_notification()

    @QtCore.pyqtProperty(int, notify=scoreChanged)
    def score(self):
        return self.m_score

    @score.setter
    def score(self, score):
        if self.m_score != score:
            self.m_score = score
            self.update_notification()
            self.scoreChanged.emit(score)

    @QtCore.pyqtSlot()
    def clear(self):
        self.score = 0

    @QtCore.pyqtProperty(int)
    def radius(self):
        return self.m_radius

    @radius.setter
    def radius(self, radius):
        self.m_radius = radius
        self.update_notification()

    def update_notification(self):
        self.setContentsMargins(0, self.m_radius, self.m_radius, 0)
        self.m_label.setPixmap(create_pixmap(self.m_score, self.m_radius))
        self.m_label.adjustSize()

    def resizeEvent(self, event):
        self.m_label.move(self.width() - self.m_label.width(), 0)
        super(NotificationButton, self).resizeEvent(event)


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.m_item_le = QtWidgets.QLineEdit("Stack Overflow")
        add_button = QtWidgets.QPushButton("Add", clicked=self.add_item)
        self.m_notification_button = NotificationButton(
            icon=QtGui.QIcon("image.png")
        )
        self.m_list_widget = QtWidgets.QListWidget()

        vlay = QtWidgets.QVBoxLayout(self)
        hlay = QtWidgets.QHBoxLayout()
        hlay.addWidget(self.m_item_le)
        hlay.addWidget(add_button)
        vlay.addLayout(hlay)
        vlay.addWidget(
            self.m_notification_button, alignment=QtCore.Qt.AlignRight
        )
        vlay.addWidget(self.m_list_widget)

    @QtCore.pyqtSlot()
    def add_item(self):
        text = self.m_item_le.text()
        self.m_list_widget.addItem(
            "%s: %s" % (self.m_list_widget.count(), text)
        )
        self.m_notification_button.score += 1
        self.m_list_widget.scrollToBottom()


if __name__ == "__main__":
    import sys

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

如何将通知号码添加到按钮图标? 的相关文章

随机推荐

  • 服务器上的 Google App 脚本请求验证

    我正在开发一个add on对于 Google 文档 我想做POST request到我的网络服务器add on 我已经这样做了 但是我应该如何在服务器端验证请求是否来自我的add on仅有的 有没有csrf就像机制中Google App S
  • Rplotly版本4.5.2散点图图例气泡大小设置

    我在 R 中使用plotly 4 5 2 我创建了一个散点图 其大小取决于变量 问题是这些大小也反映在图例中 这使得它们难以阅读 我希望我的图表保持不变 唯一的例外是图例中气泡的大小 这些气泡可以设置为全部相同大小 也可以缩放为较小的大小
  • 在 VB.NET 中将文件上传到 Google 驱动器 - 搜索工作代码

    我想使用 vb net 将 txt 文件上传到我的谷歌驱动器 我搜索了大约 2 个小时 发现了这个使用 VB NET Form 上传和下载到 Google Drive https stackoverflow com questions 15
  • R:对所有变量重复线性回归并将结果保存在新的数据框中

    我有一个名为 dat 的数据框 其中包含 10 个数值变量 var1 var2 var3 var4 var5 var 10 每个变量都有多个观察结果 dat var1 var2 var3 var4 var5 var6 var7 var8 v
  • 如何将实时聊天消息存储到数据库中?

    我在用mysqldb目前 对于我的数据库 我需要集成实时消息传递功能 这chat demo龙卷风提供does not实现一个数据库 而blog does 该消息服务将来也将兼作电子邮件 就像 Facebook 消息服务的工作原理一样 聊天平
  • GMOCK - 当返回类型为 void 时如何修改方法参数

    我有一个类 它接受指向另一个类的指针 并有一个方法 read class B public void read char str class A public A B bobj b bobj B b void read char str 我
  • t-sql获取2个日期之间的所有日期[重复]

    这个问题在这里已经有答案了 可能的重复 获取日期范围内的日期 https stackoverflow com questions 271595 getting dates between a range of dates 假设我有 2 个日
  • 如何检查变量是数组还是对象?

    为了反序列化 json 对象 我必须定义一个父类 其中包含子类的一个对象或对象数组 如果检索到对象 则它必须是一个对象 如果从 json 检索数组 则它必须是对象数组 JSON 数组对象 y x data 28 data 56 data 8
  • C++ 十六进制字符串到无符号整数[重复]

    这个问题在这里已经有答案了 可能的重复 C 将十六进制字符串转换为有符号整数 https stackoverflow com questions 1070497 c convert hex string to signed integer
  • IE 浏览器缓存和 jQuery 表单插件

    就像我之前的许多迷失的灵魂一样 我在 Ajax 表单提交和 IE 浏览器缓存的蛇坑中挣扎 我正在尝试使用 jQuery 表单插件编写一个简单的脚本来 Ajaxify Wordpress 评论 它在 Firefox Chrome Safari
  • 如何使用php从目录中删除文件

    从标题中您可以看到我正在寻找一种从不同目录中删除文件的方法 我在这个主题上能找到的就是 unlink 但是从我在文档中读到的内容以及测试该函数来看 它会从您放入的代码中删除文件名 让我觉得这与关闭文件非常相似 我想做的实际上是使用代码删除文
  • 在传递给非托管代码之前固定可更新结构?

    我使用一些旧的 API 需要将结构指针传递给异步运行的非托管代码 换句话说 在我将结构体指针传递给非托管代码之后 非托管代码复制该指针并立即返回 非托管代码可以在后台的另一个线程中访问该结构 我无法控制在另一个线程或线程本身中运行的非托管代
  • SQL Server 2008 CPU 使用率高

    我们有一个 Windows 2008 R2 Server 其中有一个 SQL Server 2008 该服务器有多个 net 站点 其中包含 SQL Server 数据库 目前 我们的平均 CPU 使用率为 95 其中大部分是由 SQL S
  • 如何在Python中使用Flask解决403错误?

    我在mac中使用python Flask制作了一个简单的服务器 请找到下面的代码 from flask import Flask app Flask name app route methods GET POST def hello pri
  • 循环遍历数据表

    出色地 我有一个包含多列和多行的数据表 我想动态循环数据表 基本上输出应该如下所示 不包括大括号 Name DataColumn Tom DataRow Peter DataRow Surname DataColumn Smith Data
  • Spark迭代HDFS目录

    我在 HDFS 上有一个目录 我想迭代这些目录 有没有简单的方法可以使用 SparkContext 对象对 Spark 执行此操作 您可以使用org apache hadoop fs FileSystem https hadoop apac
  • Stack(int = 10),这个语法是什么意思(C++)?

    template
  • C++/CLI 前向声明

    我有一个标题 如下所示 namespace Dummy ref class ISYSession namespace Afw
  • TFS 向[请求者]用户生成电子邮件警报

    这可能吗 我和我的一位同事正在寻找这种解决方案一段时间 但我们在 Google 上找不到类似的解决方案 事情很简单 当 Requested By 用户破坏了 TFS 2010 上的构建时 我们希望通过电子邮件自动提醒他或她 我们如何才能做到
  • 如何将通知号码添加到按钮图标?

    我正在尝试使用 PyQt5 制作 GUI 它将有一个带有图标的通知按钮 我想在图标上添加一个带有通知数量的小气泡 如果无法提供数字 我想使用红点作为备用方法 但是我应该如何跟踪新通知 如通知侦听器 并在窗口运行时更改图标 我一直在谷歌上搜索