- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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/
我在QPushButton的最后一列中插入了QTableview。使用该按钮,我将使用按钮释放信号和插槽handlebutton(int)删除该特定行。 cpp代码: MainWindow::Main
它编译正常,但这是我运行程序时的错误消息: QObject::connect: Cannot queue arguments of type 'QVector' (Make sure 'QVector
我在 PyQt 中使用 for 循环 连接多个信号/槽。代码如下: # Connect Scan Callbacks for button in ['phase', 'etalon', 'mirror
我正在使用 Qt 创建一个 UI,有两个元素可能存在也可能不存在。此外,他们的 parent 也是不同的元素。但是,一个会影响另一个。 我应该如何以最佳方式构造信号/槽(或者我什至不应该使用该模式)?
我正在为这事兜圈子。就是无法理解信号和插槽。 只是在寻找某种机制,当我的 C++ 中出现信号时可以自动更新我的 UI。 示例: 我在 Qml 中有两个带有文本的标签:返回值的 _app.method。
我有两条路线呈现相同的组件,但来自 API 的数据不同。 该组件有一个名为 的子组件有一个 v-if检查特定插槽是否有内容的指令(因为如果它没有内容,我不希望该插槽显示)。 但是,在同一个父组件上可
我只是问当我的 html 位于 java-script 变量而不是 DOM 本身时如何使用 .each。 如果我有这样的 html: deze this dies 我能做到
基本上,想象一个宽度为 9(从 0 开始)的基于位置的区域 ╔════╦════╦════╦════╦════╦════╦════╦════╦════╗ ║ 0 ║ 1 ║ 2 ║ 3 ║
我想做一些非常简单的事情。单击切换按钮并在 QT 中获取消息框。 cpp: _show_hide_password = new QPushButton( "abc" ); _show_hide_pas
我有一个关于信号和槽的问题。在我的应用程序中,我想将来自一个对象的信号连接到 textEdit在对话框窗口中。我的信号发出 QString ;如果我违反封装(通过将 UI 公开而不是私有(privat
你好我来自java阵营,正在尝试做一个c++程序 我有一个名为 Manifest 的数组,它接收乘客对象 for (int i = 0; i Manifest . 例如 #include #incl
似乎为 Signal 类和插槽中调用的内容提供安全跨线程信号的唯一实现是 QT。 (也许我错了?)。 但是我不能在我做的项目中使用QT。那么我怎样才能从不同的线程(例如使用 Boost::signal
我将直接从示例开始: 在游戏中,有一个袋子供玩家用来存放他们的元素(元素的大小不一),袋子的大小也是可变的。 在一个 8x15 插槽的袋子中,我需要插入一个占用 2x2 插槽的元素,我可以搜索空间来实
PyQt 按钮事件可以以正常方式连接到函数,以便函数接收默认信号参数(在本例中为按钮选中状态): def connections(self): my_button.clicked.connec
访问类槽时,而不是写入 (defmethod get-name ((somebody person) (slot-value somebody 'name)) 是否可以使用点符号(又名 C++),即
我正在使用 vee-validate v3.0 进行验证并且设置很顺利,但现在我正在尝试设置我的元素的样式,但我似乎无法让它工作。我遵循了关于样式的非常简短的文档并编辑了 vee-validate 配
我尝试使用来自 https://wiki.qt.io/QThreads_general_usage 的方法与 moveToThread。一切安好。但是,如果我尝试将参数添加到完成的信号中,则会出现以下
我刚刚使用 iAds 和 adMob 在我的应用程序中实现了 adWhirl。一切都编译正确,adMob 工作完美,但我的 iAd 大小不正确。广告看起来尺寸合适,但实际上似乎被剪掉了。大约 1/4
我正在使用 python 和 PySide 开发 GUI 应用程序。我需要在单独的线程中运行长时间的背景任务。对于线程,我决定根据“正确”的方法使用 QThread,而不是从 if 进行子类化(参见
在用于编写 GUI 代码的 Qt 的 QML 语言中,QML 元素(如果我理解正确的话)在它们变得可见之前不会被实际创建。 (编辑: 听起来这些元素是在 QML 引擎加载它们时创建的,但看起来信号/槽
我是一名优秀的程序员,十分优秀!