PyQt Code Splitting - 设计与功能

时间:2014-05-19 12:39:38

标签: python qt class inheritance pyqt

我很难理解如何在(Py)Qt中分割代码。目的是设计和设计。 QMainWindow中的导航选项卡,每个选项卡都会触发其他文件中的代码。到目前为止,它只在同一文档中使用ActionClass启动/放入外部文档导致应用程序未定义'单击选项卡时。以下工作没有错误,但很笨重。

class Main(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.u = Ui_MainWindow()
        self.u.setupUi(self)

        self.u.tabs.currentChanged.connect(self.TabsChanged)

    def TabsChanged(self, i):
        if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.__init__


class ActionClass(Main):
    def __init__(self):
        app.u.lineEdit.setText("test")

app = Main()
app.show()
sys.exit(app.exec_())

我一直看到的例子中包含一个文档中的所有代码。还有其他方法可以做到这一点,例如其中ActionClass位于另一个文件中/编写u.lineEdit.setText而不是app.u.lineEdit.setText。似乎继承&无法从ActionClasses doc访问Main的实例,因此我无法看到他们如何与Main进行通信?

非常感谢

1 个答案:

答案 0 :(得分:1)

作为建议@ M4rtini,您可以将代码分成python modules。然后在主模块中导入(使用它们)。

例如,您发布的代码可以分成文件:

# actions_class.py

class ActionClass(Main):
    def __init__(self):
        app.u.lineEdit.setText("test")

# main.py

from action_class import ActionClass  # This line no need much explanation ;)

class Main(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.u = Ui_MainWindow()
        self.u.setupUi(self)

        self.u.tabs.currentChanged.connect(self.TabsChanged)

    def TabsChanged(self, i):
        if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.__init__

app = Main()
app.show()
sys.exit(app.exec_())

要了解导入的工作原理,请参阅我上面留下的链接。

更多解释

以免见到:

__init__方法中执行代码的正确方法是创建实例。请参阅下面的示例。

class A:
    def __init__(self):
        print("Executing A.__init__")

print("Doing things wrong")
A.__init__     # This don't print enything
print("Doing things well")
A()            # This works as expected.

所以,你的行上写着:

if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.__init__

应该是:

if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass()

另一方面,一种不好的做法是将代码放在__init__方法中的初始化实例中。 如果您不需要实例但又想要将函数存储在您创建的类(类似于c ++命名空间)中 使用@staticmethod装饰者。

class A:

    @staticmethod
    def foo():
        print("Oh, wow, a static method in Python!")

A.foo()

因此,您的ActionClass可以改写为:

class ActionClass(Main):

    @staticmethod
    def do_action:
        app.u.lineEdit.setText("test")
然后你就可以这样使用它了:

 if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.do_action()