gpt4 book ai didi

python - pyqt GUI编程中如何组织类

转载 作者:太空宇宙 更新时间:2023-11-03 14:16:09 24 4
gpt4 key购买 nike

我已经使用 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 的问题。您可以将此问题扩展到任何支持基于类的编程的语言,甚至是任何具有函数的语言。

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

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

另一点(从您的问题中并未完全清楚)是每个 Qt Designer UI 文件都代表一个类。预计此 UI 定义将应用于代码中的单个类。拥有 ClassA(UI_mainWindow)ClassB 并且让 ClassB 访问 ClassA 的成员或了解 ClassA 的内部实现。回到我们的主题“separation of concerns”,ClassB 应该有自己的目的和接口(interface),并被ClassA(UI_mainWindow) 用来实现那个目的。您不希望 ClassB 知道有关主窗口的任何信息或能够执行超出其设计目的的操作。

让我们假设您的计时器示例实际上比您展示的更简单。如果将其移至另一个类,则应依靠自定义信号将意图传达回主窗口等其他类。或者您可以将每个 lcd 和标签小部件移动到它们自己的自定义类中,这些类具有使它们独立的定时器逻辑。无论哪种方式,信号/插槽都可以让自定义小部件相互连接,而无需了解其他小部件的任何信息。

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

关于python - pyqt GUI编程中如何组织类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33056555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com