首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt5/PyQt5 5最佳做法

Qt5/PyQt5 5最佳做法
EN

Stack Overflow用户
提问于 2019-10-05 10:15:37
回答 1查看 2.3K关注 0票数 2

根据要求重写以澄清。

免责声明:

我是Qt编程的新手,到目前为止,我只编写了一些很小的复杂应用程序,通常遵循提供的示例。

现在,我被要求(重新)为一个现有产品(如果重要的话,一个收银机)编写一个配置GUI,该配置GUI基于一个嵌入式Linux,其中包含一组可能正在扩展的“配置页”。有几个例子:

  • 软件更新;允许有选择地更新系统和/或应用程序。
  • 网络设置;允许有线和WiFi配置。
  • 内部数据库更新(产品、价格、.)
  • 维护:查看内部日志,内存清理,.
  • 导出:触发和配置每日/每月/年度活动报告。
  • 等。

我开始在Qt设计器中设计界面,我很快意识到,如果我只想做一个以前做过的“更大的版本”,我就会得到大量的意大利面代码。

由此引出了一个原始的,非常普遍的问题:

在具有嵌套容器的复杂接口中(QToolBox、QTabWidget、.)什么是“批准的方式”(如果有的话),以便在"MainWindow“中没有成千上万的插槽?

对于非平凡的例子,任何指向“最佳实践”的指针都将受到欢迎。

状态:

我目前正处于设计/原型设计阶段,我可以很容易地进行更改;当然,以后的更改可能不太方便。

我目前的设计相当标准:

  • 一个用Qt设计器构建的带有顶级QToolBox Widget的单块GUI界面,用于选择要编辑的“页面”,并根据特定的配置需要定制各个页面。
  • 使用标准范例导入pyqt5:
代码语言:javascript
运行
复制
    class MWindow(QMainWindow):
        def __init__(self):
            super(MWindow, self).__init__()
            uic.loadUi('app.ui', self)

        ...

    app = QApplication(sys.argv)
    mw = MWindow()
    mw.show()
    sys.exit(app.exec_())
  • 让后端与目标对话,并提供“命令”来实际执行所需的操作(我不能拥有适当的MVC,因为'M‘在其他地方,'C’是分开的,部分是在配置程序上,部分是在目标上)。

我很快发现,如果我想要进行适当的输入验证,并且“对用户友好”(例如:从编辑的IP地址自动生成Net掩码/广播,更不用说以太网配置和WiFi配置之间的大量代码重复),我可以为每个“页面”处理数十个插槽。这是目前不需要的,但我知道稍后会提出要求,我想提前计划。

问题:

在其他情况下,我会尝试使所有与UI相关的处理更本地化;例如:

  • 编写类/页以处理IP地址
  • 子类来添加WiFi所需的内容。
  • 为目标上实际可用的每个连接构建一个选项卡小部件,根据需要实例化上面的一个类。
  • 将选项卡小部件放入工具箱页面中。
  • 冲洗并重复。

一些现实生活中的例子(参见:威雷沙克氏MainWindow)似乎与“单一篮子中的一切”方向相反。

是否有任何合理的综合的最佳实践建议来处理这种情况?

更重要的是:如果我坚持将代码分割成“分而治之”的方法,这将如何转化为QtDesigner/代码关系?(我绝对不想求助于手工代码GUI)。

EN

回答 1

Stack Overflow用户

发布于 2019-10-05 15:02:32

我认为Qt提供的示例将决定最佳实践,因为大多数开发人员都会从这些实践开始,并将他们的标准建立在它们之上。

或者,您可以使用KDE做法作为起点,因为它们可能是最大的Qt项目。

但是.

通常,为了最小化UI元素(例如主窗口)的复杂性,并使应用程序更加解耦(因此,更易于维护),您可以使用(MVC)模式。

在典型的用例中,每个UI元素(“视图”)都由一个控制器类和一个模型类支持。当信号被触发时,会调用控制器上的适当方法。控制器方法依次调用模型上的方法和/或更改另一个UI元素。

上面的例子给出了视图、控制器和模型之间的一对一关联,但是您可以根据您的需求来改变这一点。

还有其他MVC的现代衍生工具(例如MVVM和MVP),但我更喜欢它,因为它很简单,而且当正在使用的框架支持它们时,其他模式更有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58247357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档