如何在pyqt GUI编程中组织类

dnt*_*nth 3 python oop class 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_()
Run Code Online (Sandbox Code Playgroud)

jdi*_*jdi 5

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

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

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

另一点(您的问题尚未完全清楚)是Qt Designer UI文件每个都代表一个类。预期该UI定义将应用于代码中的单个类。拥有ClassA(UI_mainWindow)ClassB并拥有的ClassB成员ClassA或对的内部实现一无所知将是一个糟糕的设计ClassA。回到我们的“ 关注点分离 ” 主题,ClassB应该具有自己的目的和接口,并由ClassA(UI_mainWindow)来实现该目的。您不希望ClassB了解有关主窗口的任何信息,或者想要完成其设计目的之外的其他事情。

让我们假设您的计时器示例实际上比您展示的要琐碎。如果将其移至另一个类,则应依靠自定义信号将意图传达回其他类,例如主窗口。或者,您可以将每个LCD和Label窗口小部件移动到具有自己的计时器逻辑的自定义类中,从而使它们自成一体。无论哪种方式,signal / slot都可以使自定义小部件彼此连接,而无需了解其他小部件的任何信息。

总而言之,您可以说在另一个类中构造任何非平凡的UI元素时(如果它需要很多代码行,或者需要一堆SLOT函数和接线,则可以在Qt中创建单个类是很好的)内部逻辑)。这将使您避免重复逻辑,并使您拥有可重用的代码。这也将使您的主窗口更小并且更易于调试,因为您可以在大脑中保持较小的心理模型以了解主窗口在做什么。如果尝试将UI元素保持为单一用途且尽可能通用,那么最终将有很多可重用的类。