gpt4 book ai didi

c++ - Qt 中信号槽的层次结构太深

转载 作者:行者123 更新时间:2023-11-30 03:25:00 24 4
gpt4 key购买 nike

我正在用 Qt 编写 GUI 应用程序。目前我在例行公事上浪费了太多时间。我的架构似乎有问题。请告诉我如何改变改进代码的方法。

我在做什么:

我的程序可以分解为类的层次结构(不是继承而是组合)。例如:

class D { /* something */ };
class C { /* something */ };
class B { C c1; C c2; D d1; };
class A { D d1; C c1; };

因此,实际上它是一个树状层次结构,其中叶节点(C 类、D 类)是 Qt 术语中保存数据的“模型”。在层次结构的顶部放置 MainWindow(A 类),它包含第一级“ View ”(D 类,即子窗口小部件)和带有数据的叶节点(C 类,即文本字段)。

为了将信息从主窗口向下传递到数据,我使用从主窗口(按钮)到叶节点的函数调用。之后数据发生变化并通过信号槽机制将其告知 parent 。 parent 继续通过信号向上传递信息。

建立所有这些交流我真的很无聊。现在我最多有 5 个级别,但是在使用组合时通常的代码中并没有那么多。请告诉我如何改变我的方法。由于这些连接的复杂性,代码的开发极其缓慢,几乎停滞不前。


具体的例子很难给出,因为代码很多,但是解决起来难度很大的问题思路如下:

有两个QTreeView,它们以不同的方式显示从QAbstractItemModel继承的自己模型的数据(模型内部的树不是前面讨论的那棵树,这棵树只是一层层次)。 我想在一个 QTreeView 中选择对象,并在第二个 QTreeView 中根据该选择进行更改。总共有 2 个 QTreeView、2 个不同的 QAbstractItemModel 实例、2 个自己的对象树(对于每个 QAbstractItemModel)和 单个数据。

最佳答案

听起来您可能已经成为经历过多示例的受害者。示例往往会在不属于它的地方塞满功能,从而有可能养成不良的编程习惯。

在实际生产中,事情需要更加划分。主窗口不应该是“应用程序逻辑”的容器,它需要关心的只是将主要的小部件放在一起。

但这似乎不是你的情况,根据你所说的将事情委托(delegate)给“从主窗口(按钮)到叶节点”的必要性来判断。

在更大的范围内,根本不建议将应用程序逻辑与 UI 混合,更不用说将其全部塞入主窗口中了。应用程序逻辑应该是它自己的层,设计成它可以在没有任何 GUI 的情况下工作,然后 GUI 是另一个简单地连接到逻辑核心的层。

逻辑核心也不应该是单一的,它应该由专注于其特定任务的单个组件组成。

您的用例实际上并不需要大量的连接,只需要一些基本的 UI 元素处理程序,它们应该针对逻辑核心 API 而不是 GUI 元素,就像您现在所做的那样。

不幸的是,你的澄清对我来说完全没有意义,目前还完全不清楚你到底想做什么。

让我们假设您的情况是这样的:

树 1 显示文件夹结构。

树 2 显示了在树 1 中选择的文件夹的文件内容。

数据是文件的编辑器,假设是一个文本文件,在树 2 中选择。

因此,在伪代码中,假设 app 是您的应用程序核心逻辑对象:

单击树 1 中的项目显示 app.setFolder(tree1.selectedItem())

点击树 2 中的一个项目说 app.setFile(tree2.selectedItem())

点击编辑器的“保存”按钮显示app.save(editorUI.dataField.text())

logic layer                          gui layer
app mainWindow
folder <-----------select----------- tree1
file <-----------select----------- tree2
save(newData) { editor
if (file) file.rewrite(newData) textField
} saveBtn: app.save(textField.text())

关于c++ - Qt 中信号槽的层次结构太深,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49286453/

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