编程语言
首页 > 编程语言> > 如何在pyqt GUI编程中组织类

如何在pyqt GUI编程中组织类

作者:互联网

我使用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并拥有ClassA的ClassB访问成员或了解ClassA的内部实现是一件很糟糕的设计.回到我们的主题“separation of concerns”,ClassB应该有自己的目的和接口,并由ClassA(UI_mainWindow)用来实现这个目的.你不希望ClassB知道关于主窗口的任何信息,或者能够做到超出其设计目的.

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

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

标签:qt-designer,python,class,oop,pyqt4
来源: https://codeday.me/bug/20190829/1762759.html