PyQt:如何全球化'其他课程的一个类别的def?

时间:2018-01-31 13:36:48

标签: python pyqt pyqt4 pyqt5

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

因为它们都是一样的,我想问一下是否有任何方法只能编写一次这个def,并将它设为global,正如我想象的那样,以便其他类/窗户可以用吗?

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())

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

首先,这不是" def",而是一种方法。

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

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方法。

答案 1 :(得分:1)

如果没有其他基类可以合适地定义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):
        ...