[英]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.