无法更改 PySide.QtGui 对象的 __class__

2024-02-07

我经常使用 PyQt4 - 有时我喜欢重载一些对象以允许我添加一些功能。这在 PyQt4 中工作得很好,例如:

from PyQt4 import QtGui
button = QtGui.QPushButton()
class MyPushButton(QtGui.QPushButton): pass
button.__class__ = MyPushButton

但是,我正在尝试调整我的一些代码,以便它使用 PySide 而不是 PyQt4。我的理解是它们应该具有相同的功能。 PySide 不允许我做同样的事情。

from PySide import QtGui
button = QtGui.QPushButton()
class MyPushButton(QtGui.QPushButton): pass
button.__class__ = MyPushButton

这个错误是:

TypeError: __class__ assignment: only for heap types

有没有其他方法可以更改对象的类以避免此错误?我不太确定是什么原因造成的。

注意:我需要在创建对象后更改对象的类,因为该对象是在 pyuic 编译的库中创建的。另外我的 PySide 安装没有 uic 模块。


PySide 使用Shiboken http://shiboken.readthedocs.org/en/latest/生成 Qt 的 CPython 绑定 它的 C++ 类。所有 Qt python 类,例如QPushButton是 用 C++ 实现,这就是为什么你不能覆盖__class__.

>>> button = QPushButton()
>>> button.__class__ = MyButton
TypeError: __class__ assignment: only for heap types

根据 Shiboken 的文档,您可以猴子补丁(或鸭拳) http://shiboken.readthedocs.org/en/latest/wordsofadvice.html#duck-punching-and-virtual-methods已经实例化的对象上的方法,只要这些方法是 虚拟(可重写):

import types

def override_text(self):
    return 'overridden'

# Bind override_text() to button.
button.text = types.MethodType(override_text, button, QPushButton)

更进一步,你可以细分QPushButton as MyButton, 和 动态注入方法MyButton进入QPushButton实例。制作MyButton的一个子类QPushButton纯粹是 可选,但允许您创建自己的实例MyButton除了修改后的QPushButton实例。

让我们定义一下MyButton作为一个子类QPushButton.

class MyButton(QPushButton):

    def text(self):
        # This will override QPushButton's text() method.
        print("inside MyButton.text()")
        return QPushButton.text(self)
  • 注意:您必须使用旧式的调用父类方法。super()失败了TypeError因为自我实际上是一个QPushButton而不是一个MyButton当方法被注入时。

或者,如果您想采用更多混合方法,让我们定义MyButtonOverrides:

class MyButtonOverrides(object):

    def text(self):
        # This will override QPushButton's text() method.
        print("inside MyButtonOverrides.text()")
        return self.__class__.text(self)
  • 注意:您可以致电QPushButton.text()直接通过self.__class__因为你不会使用MyButtonOverrides直接地。

现在让我们定义extend_instance()这将注入你的覆盖 方法来自MyButton (or MyButtonOverrides) 进入QPushButton实例:

import inspect

def extend_instance(obj, cls):
    for name, attr in vars(cls).items():
        if inspect.isroutine(attr):
            # Bind instance, class and static methods to *obj*.
            setattr(obj, name, attr.__get__(obj, obj.__class__))

如果您希望您的类方法保持与其原始类的绑定 (例如。,MyButton)然后使用以下内容:

def extend_instance(obj, cls):
    for name, attr in vars(cls).items():
        if inspect.isroutine(attr):
            if isinstance(attr, classmethod):
                # Bind class methods to *cls*.
                setattr(obj, name, attr.__get__(cls, cls))
            else:
                # Bind instance and static methods to *obj*.
                setattr(obj, name, attr.__get__(obj, obj.__class__))

通过我的测试,这在 Python 2.7 和 3.3 中有效,但应该 适用于 2.6+ 和 3+。

最后修改按钮,使用extend_instance().

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

无法更改 PySide.QtGui 对象的 __class__ 的相关文章

  • setColumnStretch 和 setRowStretch 如何工作

    我有一个使用构建的应用程序PySide2它使用setColumnStretch用于柱拉伸和setRowStretch用于行拉伸 它工作得很好 但我无法理解它是如何工作的 我参考了 qt 文档 但它对我没有帮助 我被困在括号内的两个值上 例如
  • 使用 keras 澄清 Yolo v3 模型输出

    我将 yolo v3 模型与 keras 一起使用 该网络为我提供了形状如下的输出容器 1 13 13 255 1 26 26 255 1 52 52 255 所以我找到了这个link https www cyberailab com ho
  • 如何在Python中反转列表的列表? [复制]

    这个问题在这里已经有答案了 我想知道如何反转 python 中的列表列表 例如 原来的 list 1 2 3 4 5 6 7 8 9 输出 new list 7 8 9 4 5 6 1 2 3 现在 我正在尝试这样做 new list re
  • 使用python编辑html,但是lxml将漂亮的html实体转换为奇怪的编码

    我正在尝试使用 python 带有 pyquery 和 lxml 来更改和清理一些 html Eg html div p It 146 s a spicy meatball p div lxml html clean 函数 clean ht
  • 如何检查给定的数字是否是2的幂?

    下面的代码不适用于某些输入 a i set 1 while i lt 10000 a add i i lt lt 1 N int input if N in a print True else print False 我最初的想法是检查每个
  • 如何用pygame画一条虚线?

    我需要在坐标系上绘制正弦波和余弦波 就像在this https i stack imgur com DGI8g png图片 除了没能代表以外 我所有的工作都做得很好虚线和曲线与 pygame 一致 我有与我需要的类似的东西 但我怎样才能让它
  • pandas DataFrame 中行的高效成对比较

    我目前正在处理一个较小的数据集 大约 900 万行 不幸的是 大多数条目都是字符串 即使强制类别 框架在内存中也只有几 GB 我想做的是将每一行与其他行进行比较 并对内容进行直接比较 例如 给定 A B C D 0 cat blue old
  • Python正则表达式替换引号中的文本(引号本身除外)

    例如 我有一个测试字符串 content I opened my mouth Good morning I said cheerfully 我想使用正则表达式删除双语音标记之间的文本 但不删除语音标记本身 所以它会返回 I opened m
  • 私有属性,但却是一个神秘的领域

    我想将属性设为私有 但带有 pydantic 字段 from pydantic import BaseModel Field PrivateAttr validator class A BaseModel a str I want a py
  • python os.fork 使用相同的 python 解释器吗?

    据我所知 Python 中的线程使用相同的 Python 解释器实例 我的问题是与创建的流程相同os fork 或者每个进程创建的os fork有自己的翻译吗 每当你 fork 时 整个 Python 进程都会在内存中复制 包括Python
  • 如何在 tkinter 后台运行函数[重复]

    这个问题在这里已经有答案了 我是 GUI 编程新手 我想用 tkinter 编写一个 Python 程序 我想要它做的就是在后台运行一个可以通过 GUI 影响的简单函数 该函数从 0 计数到无穷大 直到按下按钮为止 至少这是我想要它做的 但
  • 使用张量流导出神经网络的权重

    我使用张量流工具编写了神经网络 一切正常 现在我想导出神经网络的最终权重以制定单一的预测方法 我怎样才能做到这一点 您需要在训练结束时使用以下命令保存模型tf train Saver https www tensorflow org ver
  • Pandas 根据条件替换数据框值

    我有一个主数据框 df Colour Item Price Blue Car 40 Red Car 30 Green Truck 50 Green Bike 30 然后我有一个价格修正数据框 df pc Colour Item Price
  • 哈希 freezeset 与排序元组

    在 Python 中 给定一组可比较的 可散列的元素s 散列是否更好frozenset s or tuple sorted s 这取决于你在做什么 创建一个更快frozenset 比排序tuple but frozenset占用的内存比tu
  • 在基本 Tensorflow 2.0 中运行简单回归

    我正在学习 Tensorflow 2 0 我认为在 Tensorflow 中实现最基本的简单线性回归是一个好主意 不幸的是 我遇到了几个问题 我想知道这里是否有人可以提供帮助 考虑以下设置 import tensorflow as tf 2
  • PySpark DataFrame 上分组数据的 Pandas 式转换

    如果我们有一个由一列类别和一列值组成的 Pandas 数据框 我们可以通过执行以下操作来删除每个类别中的平均值 df DemeanedValues df groupby Category Values transform lambda g
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 从函数在 python 3 中创建全局变量

    我想知道为什么在函数结束后我无法访问变量 variable for raw data 代码是这样的 def htmlfrom Website URL import urllib request response urllib request
  • python 中“重载”函数的最佳方法? [复制]

    这个问题在这里已经有答案了 我正在尝试在 python 中做这样的事情 def foo x y do something at position x y def foo pos foo pos x pos y 所以我想根据我提供的参数数量调
  • 如何在Python中不使用库函数将字符串转换为整数?

    我正在尝试转换 a 546 to a 546 不使用任何库函数 我能想到的 最纯粹 gt gt gt a 546 gt gt gt result 0 gt gt gt for digit in a result 10 for d in 01

随机推荐

  • 地图和字典有什么区别?

    I know a map is a data structure that maps keys to values Isn t a dictionary the same What is the difference between a m
  • 将反应路由链接集成到 Material UI 列表中

    我正在尝试创建一个链接列表 https material ui com components lists 在侧边栏中 问题是如果我使用
  • 无法连接到 net.tcp:连接尝试持续了一段时间

    在远程构建计算机上 运行单元测试时出现以下错误 测试方法 MyNameSpace1 MyNameSpace2 Service Test MyPath XYZServiceTest FindRecord 引发异常 System Service
  • 如何在 GlassFish 中更新 Mojarra 版本

    我想更新我的 JSF 应用程序以使用 Mojarra 版本 2 1 8 我将这些行添加到 WAR 包的 POM 文件中
  • 为旧浏览器显示替代错误页面时使用什么 HTTP 状态代码?

    我有一个大量使用 CSS3 和一些 HTML5 现代功能的网站 所以它在 IE7 或更低版本中不起作用并且看起来很糟糕 我们决定不支持这些旧浏览器 因为这对于极少数用户来说工作量太大 他们看到的是特殊的错误 警告页面 而不是显示常规页面 他
  • Delphi 中更好的多线程调试

    从关于 Delphi IDE 中的错误的另一个问题的答案开始 有谁知道是否有办法改进 IDE 的多线程调试功能 或者如果没有 至少为什么它有时如此糟糕 当程序中有多个线程时 使用 F7 或 F8 单步执行代码通常会导致长时间暂停 或者整个
  • 删除 Google Cloud Functions 的 tmp 文件夹中的文件

    我目前正在 os tmpdir 文件夹中的谷歌云函数中写入文件 现在我知道每次函数触发时都会略有不同 并且函数调用之间的 tmp 文件夹永远不会相同 不能两次引用相同的 tmp 文件夹 我的问题是我是否需要在函数完成执行之前删除该文件 或者
  • GWT:使用 GWT 登录页面对应用程序的某些部分进行身份验证

    我的应用程序具有一些所有用户都可以访问的功能 以及一些其他功能的访问权限应仅限于经过身份验证的用户 所有这些受限制的功能都存在于某些 GWT Places 集合中 因此 应用程序中可用的所有 Places 可以分为两组 所有人均可访问 和
  • AngularJS 禁用指令

    我正在使用editable text指令来自xeditableAngularJS 的模块 有没有办法禁用整个页面的指令 我考虑过使用替换可编辑文本 variable where variable editable text 启用和varia
  • 计算补货点 - 基于集合的 SQL 查询

    我有一个包含以下数据的视图 它代表 2 个生产单元的一种计划 每个细胞生产由多个部分组成的产品 每个生产单元都可以生产任何产品 但对于给定产品 每个单元的生产周期时间通常会有所不同 因为这些单元具有不同的配置 工具 设备 人力等 生产是按批
  • 包私有伴随对象中的隐式值/转换

    我试图找到与此相关的任何信息 文档 规格等 但这个主题似乎很难用谷歌搜索 我要求提供有关以下内容为何有效的参考资料 trait Foo A package bar trait Bar private bar object Bar impli
  • 在 Rails 中的路由上使用通配符和重定向时出错

    match myroute gt redirect http google com as gt myroute 上面的行在routes rb导致以下错误 Users user rvm rubies ruby 1 9 2 p290 lib r
  • 如何从实体对象获取对上级对象的引用

    如何从 EntityObject 类获取对上级 ObjectContext 的引用 看看下面的链接 http blogs msdn com alexj archive 2009 06 08 tip 24 how to get the obj
  • ScrollViewer 无法在 groupbox 内工作?

    我想包括ScrollViewer in my Groupbox 但它不起作用 我的代码是
  • Yandex Metrica 标签降低了网站速度 Google PageSpeed Insights 报告

    因此 在我的所有网页上 我都有此代码 Yandex metrika 使用该代码进行分析 根据谷歌的说法 这个脚本正在减慢我的页面速度 需要改变它的加载方式 以免渲染阻塞 TTI 时间输入阻塞 FID 第一个输入延迟阻塞 第一个内容绘制阻塞
  • 在数据框中设置样式后执行操作

    每当我尝试在代码中设置样式后执行任何操作时 我都会看到以下错误 AttributeError Styler 对象没有属性 drop 在本例中 我尝试在应用样式后删除一列 在其他情况下 我尝试连接 2 个数据帧 但它会引发类似的错误 我对 P
  • psql:错误:致命:用户的 Cloud SQL IAM 服务帐户身份验证失败

    我已按照以下说明使用 IAM 身份验证设置了我的云 sql 数据库 https binx io 2021 05 19 how to connect to a cloudsql with iam authentication https bi
  • 不要扩展 CMake 列表变量

    我有一个 CMake 脚本 可以通过以下方式运行一些测试add test 在 Windows Server 2008 不要问 下运行于 CMake 3 15 当调用这些测试时 它们运行的 环境中的 PYTHONPATH 环境变量似乎会重置为
  • 将 twig 与 React.js 集成

    我已经成功使用 php symphony 及其 twig 模板系统构建了一个 Web 应用程序 但现在需求发生了变化 我必须使用 Node React js 我已经阅读了一些关于 React js 的文档 但我仍然不知道在严格的时间范围内最
  • 无法更改 PySide.QtGui 对象的 __class__

    我经常使用 PyQt4 有时我喜欢重载一些对象以允许我添加一些功能 这在 PyQt4 中工作得很好 例如 from PyQt4 import QtGui button QtGui QPushButton class MyPushButton