繁体   English   中英

如何在PySide中将功能与gui类分开?

[英]How do I separate the functions from the gui class in PySide?

在我的PySide项目中,我有3个文件:

  • 其中包含所有从Qt Designer转换为python的gui内容,

  • 另一个具有信号,所有逻辑和功能以及

  • 再启动整个应用程序。

我认为最好将逻辑与功能分开。

以下是在tablewidget中插入项目的简单函数:

# my_functions.py
def fill_table():
    for row in range(10):
        for col in range(10):
         item_value = "...."
         item = QtGui.QTableWidgetItem()
         item.setText(str(item_value))
         table_widget.setItem(row, col, item)

我的主要问题是如何在单独的模块中引用应用程序中的小部件。

假设my_functions.py是文件列表中的第二项,则似乎fill函数使用module-global table_widget 我不建议这样做,但是如果这确实是您想要的,请访问它。 所以用

# my_functions.py
table_widget = ...  # somewhere in that file, not shown in your post
def fill_table(): 
     ...populate table_widget...

然后:

# main.py
import my_functions
...
... somewhere, use my_functions.table_widget...

最好在my_functions.py定义一个自定义类,在main.py实例化,并使fill_table()成为自定义类的方法:

# my_functions.py
class MyTableWidget(QTableWidget):
    ...
    def fill(self):
        for row in range(10):
            for col in range(10):
                item_value = "...."
                item = QtGui.QTableWidgetItem()
                item.setText(str(item_value))
                self.setItem(row, col, item)

# main.py
from my_functions import MyTableWidget
table = MyTableWidget()
table.fill()

有很多方法,但是基本上,您当前的设计似乎是过程性的,而不是面向对象的。 没问题,但是一段时间后您会发现它与其余的PyQt和Python冲突,一旦您的应用程序经过原型开发阶段,它就不那么容易维护和调试。 所以我建议第二种方法。

典型的Qt应用程序中的对象以父/子关系连接在一起。 最常见的是,有一个顶层主窗口,它充当根对象,所有其他对象(小部件,布局等)都按其下的层次结构排列。

鉴于此,将所有与gui相关的程序逻辑放在主窗口类中是很自然的,因为所有其他对象随后都可以通过self进行访问。 但是,如果将所有与gui相关的逻辑放在单独模块中的函数中,则没有self可用。 因此,您将需要提供缺少的功能。

最明显的方法是在启动应用程序的模块中保留对顶级窗口的引用,以便其他模块可以导入它:

from app_module import main_window

# my_functions.py
def fill_table():
    for row in range(10):
        for col in range(10):
            item_value = "...."
            item = QtGui.QTableWidgetItem()
            item.setText(str(item_value))
            main_window.table_widget.setItem(row, col, item)

或者,您可以重新设计所有功能,以便它们仅对一个对象(或对象类)起作用,然后显式传递实例:

# my_functions.py
def fill_table(table_widget):
    ...

但是,无论采用哪种方式,都很难看出这可能是构造代码的“最佳”方式。

大多数gui应用程序由几个相互独立或多或少工作的大型子组件,以及将它们全部组织为一个功能单元的中央控制器/管理器组成。 子组件通常是小部件子类(可能位于单独的模块中),它们将成为主窗口的子级,主窗口也可以用作控制器/管理器。 按照这些思路组织代码与Qt的工作方式更加一致,并且可以自动避免应用程序各个部分之间的大多数潜在通信问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM