PyQt:如何在一个类中为其他类“全局化”def?

Posted

技术标签:

【中文标题】PyQt:如何在一个类中为其他类“全局化”def?【英文标题】:PyQt: How to 'global' a def in one class for other classes? 【发布时间】:2018-01-31 13:36:48 【问题描述】:

在我的 PyQt5 应用程序中有很多类/窗口。几乎所有的窗口都包含一个相同的def,即下面代码中显示的def center(self)。它具有将windwo放置在屏幕中间的功能。

因为都是一样的,请问有没有什么方法可以把这个def只写一次,按照我的想象改成global,这样其他类/windows也可以使用?

class MyApp(QWidget):
    def __init__(self):
        # some definations
        # click a button to open Window1

    def center(self):  # I have a def here.
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

class Window1(QWidget):
    def __init__(self):
        # some definations
    def center(self):  
      # Question: Same def here. How to NOT write this def, but use the def from the MyApp class?
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

感谢您的帮助!

【问题讨论】:

【参考方案1】:

首先这不是“一个定义”,而是一个方法。

在类之间共享方法(或任何属性)的方式不是使它们成为全局的,而是通过创建它们可以继承的共享超类。所以你可以这样做:

class CenteredWidget(QWidget):
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

class MyApp(CenteredWidget):
    def __init__(self):
        # some definations
        # click a button to open Window1

class Window1(CenteredWidget):
    def __init__(self):
        # some definations

由于 MyApp 和 Window1 都继承自 CenteredWidget,它们都会自动访问它定义的 center 方法。

【讨论】:

【参考方案2】:

如果没有其他基类可以适当地定义center,请使用混合类。

class Centerable(object):
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

class MyApp(QWidget, Centerable):
    def __init__(self):
        ...

class Window1(QWidget, Centerable):
    def __init__(self):
        ...

【讨论】:

以上是关于PyQt:如何在一个类中为其他类“全局化”def?的主要内容,如果未能解决你的问题,请参考以下文章

在密封类中为抽象 val 赋值

如何在 kivy 屏幕更改中调用类中的 def

c++继承是如何工作的?

如何在另一个类中更新变量

如何检查是否从另一个类中检查了RadioButton?

如何在一个 CSS 类中为按钮设置不同的颜色