如何在pyqt GUI编程中组织类

时间:2015-10-10 16:58:29

标签: python class oop pyqt4 qt-designer

我使用qt designer和pyqt构建了一个主窗口GUI。随着程序变得越来越复杂,仅使用一个类可能导致需要管理的方法和属性太多。我认为我应该构建新的类,以使事情更易于管理。

我的第一个问题是,我如何知道何时为我的应用程序添加新类?是否有任何经验法则作为一般指导?为新窗口/标签添加新类是一个好主意吗?

我的第二个问题是,如果我为我的应用程序添加了新类,我的新类如何获得我在Qt设计器中设计的Ui_MainWindow设计文件的访问权限?下面是我的主窗口的示例代码。它是一个显示当前时间的简单时钟。假设我想为时钟显示创建一个类,如何有效地使用OOP重写代码?

from PyQt4 import QtGui
from myMainWindowUI import Ui_MainWindow

class MyMainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        super(MyMainWindow, self).__init__(*args, **kwargs)
        self.setupUi(self)

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.Time)
        self.timer.timeout.connect(self.Date)
        self.timer.start(1000)
        self.lcdNumber_time.setDigitCount(8)
        self.lcdNumber_time.display(strftime("%H"+":"+"%M"+":"+"%S"))
        self.label_dynamic_date.setText(strftime("%Y"+" "+"%B"+" "+"%d"+", "+"%A"))

def Time(self):
    self.lcdNumber_time.display(strftime("%H"+":"+"%M"+":"+"%S"))
def Date(self):
    self.label_dynamic_date.setText(strftime("%Y"+" "+"%B"+" "+"%d"+", "+"%A"))

app = QtGui.QApplication(sys.argv)  # A new instance of QApplication
form = MyMainWindow()                 
form.show()                         
app.exec_()

1 个答案:

答案 0 :(得分:5)

一般来说,这不一定是Qt特定的问题。它也不一定是特定于python的问题。您可以将此问题扩展到支持基于类的编程的任何语言,甚至任何具有函数的语言。

当您想要封装行为时编写类是有意义的。类通常应该提供单一目的,并向外部公开接口,允许类的用户与您设计的行为完全交互。一旦拥有了这个单一用途的类,您现在就拥有了可重用的行为。您可以将此推理的一部分应用于函数,其中您说某个函数具有特定目的,并且一旦您将其设计为执行一些行为,您现在就具有可重用的函数。

将此应用于Qt,当逻辑不再是微不足道时,将代码移动到自己的类中是有意义的。例如,您首先在主窗口中创建并显示QMessageBox。但是在某些时候,您需要收集更多类型的信息,甚至在构建对话框时传递一些初始信息。虽然您可以根据需要在主窗口中动态构建它,但最好将其移动到自己的对话框类中,并使用自己的私有逻辑来构造。然后根据需要实例化一个,将预期的参数传递给它的构造函数。现在,您的主窗口不再需要关注构建特殊对话框。

另一点(从您的问题中并未完全清楚)是Qt Designer UI文件各自代表一个类。预计此UI定义将应用于代码中的单个类。拥有ClassA(UI_mainWindow)ClassBClassB访问ClassA成员或了解ClassA的内部实施情况是一件糟糕的设计。回到我们的主题#34; separation of concerns",ClassB应该有自己的目的和界面,并由ClassA(UI_mainWindow)用来实现这一目的。您不希望ClassB了解主窗口的任何信息,或者能够做到超出其设计目的。

让我们假设您的计时器示例实际上比您所展示的更为简单。如果您将其移动到另一个类,您应该依靠自定义信号将意图传达回其他类,如主窗口。或者你可以将每个lcd和label小部件移动到他们自己的自定义类中,并使用自己的定时器逻辑使它们自包含。无论哪种方式,信号/插槽都可以让自定义小部件相互连接,而无需了解其他小部件。

总之,你可以说当你在另一个类中构造任何非平凡的UI元素时,在Qt中创建单独的类会很好(当它需要很多代码行,或者它需要一堆SLOT函数时和内部逻辑的接线)。这将使您不再重复逻辑,并允许您拥有可重用的代码。它还可以使您的主窗口更小,更容易调试,因为您可以在主窗口保持较小的心理模型。如果您尝试将UI元素保持为尽可能专注于单一用途并且通用,那么最终会有很多可以重用的类。