繁体   English   中英

如何在pyqt GUI编程中组织类

[英]How to organize classes in pyqt GUI programming

我使用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_()

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

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

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

另一点(你的问题并不完全清楚)是Qt Designer UI文件每个代表一个类。 预计此UI定义将应用于代码中的单个类。 这将是糟糕的设计有ClassA(UI_mainWindow)ClassB ,并有ClassB访问成员ClassA或了解内部实现的事情ClassA 回到我们关于“ 关注点分离 ”的主题, ClassB应该有自己的目的和接口,并由ClassA(UI_mainWindow)用来实现这个目的。 你不希望ClassB知道关于主窗口的任何信息,或者能够做到超出其设计目的。

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

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

暂无
暂无

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

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