PyQt代码分割-设计Vs功能



我正在努力理解如何在(Py)Qt中分割代码。目的是设计&QMainWindow中的导航选项卡,每个选项卡触发其他文件中的代码。到目前为止,它只在同一文档中启动ActionClass/在外部文档中放置会导致点击选项卡时"app not defined"。下面的代码没有错误,但是有些笨拙。

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。似乎是继承。Main的一个实例不能从ActionClasses文档访问,所以我看不出他们将如何通信回Main?

非常感谢

建议@M4rtini你可以把你的代码分成python模块。然后在主模块中导入它们(使用它们)。

例如,你发布的代码可以分成几个文件:

# 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__

和should读作:

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

最新更新