【问题标题】:How to pass a QTextEdit to signal/slot mechanism如何将 QTextEdit 传递给信号/插槽机制
【发布时间】:2016-10-10 10:00:22
【问题描述】:

我在这里阅读了一些关于信号和插槽及其参数的主题,但没有发现以下问题: 我正在使用 Qt 5.7

我只有 2 个类,在第一个类中,我想用字符串 messagelocation(或特定对象)在哪里显示它。

现在是这样的:我在第一堂课上发出信号:

    emit signalWriteToTextEdit("hallo","textEdit_3");

我想要做的是以某种方式将像 textEdit 这样的对象作为第二个参数传递。现在没有 QString 了。

第二类是槽:

void writeToTextEdit(QString info, QString where){   
    where.append(info); //I would like to do something like this
}

只是不知道如何将第二个参数“where”视为可访问对象,例如 textEdit,因此我可以更改其内容。

如果可能的话,我也在考虑:

  1. Ui 对象是否有一些方法,例如按名称查找元素?
  2. 是否可以使用 foreach 遍历 ui 中的所有元素并检查它们的名称...?我试过了,但不知道该怎么做。

如果不清楚,我会解释更多

【问题讨论】:

  • 您可以使用QSignalMapper doc.qt.io/qt-5/qsignalmapper.html
  • 顺便说一句,如果你有一个指向对象的指针作为“第二个参数”,为什么你根本不想调用一个方法?为什么需要那里的信号?
  • @DušanTichý 所以类 1 对 GUI 元素一无所知?在这种情况下,您只能在键和要写入的元素之间建立映射。我建议在开始时建立一个静态地图以便更快地查找,而不是每次都循环。
  • 我必须同意上面的@DmitrySazonov。您的发射器拥有几乎足够的数据来执行所需的操作——QTextEdit 的名称——但无法直接访问QTextEdit。这是在发送者和接收者之间划分功能的一种非常奇怪的方式。发射器最初是如何获得QTextEdit 名称的?难道它没有传递一个指向QTextEdit 的指针,而不仅仅是它的名字吗?
  • 使用单独的方法将文本附加到不同的QTextEdits 并没有错。到目前为止,您提供的信息似乎是最好的解决方案。

标签: qt


【解决方案1】:

经过一番挖掘,我遇到了QObject::findChild 函数。这将允许通过 UI 递归查找字符串,我不确定性能。

编辑以获取更多详细信息:

返回此对象的子对象,该子对象可以转换为类型 T 并称为名称,如果没有这样的对象,则返回 0。省略 name 参数会导致匹配所有对象名称。搜索是递归执行的。

如果匹配搜索的孩子不止一个,最直接的 祖宗归来。如果有几个直系祖先,那就是 未定义将返回哪一个。在这种情况下,findChildren() 应该使用。

【讨论】:

  • 是的,我找到了,但是这个方法没有我的 ui 对象
  • @DušanTichý:您在传递给 ui 对象的 setupUi() 方法的小部件上调用它。
  • 不知道为什么,它给了我访问冲突错误,试图在父 Ap( QWidget *parent) 上执行此操作:QWidget(parent) { ui.setupUi(this); }
【解决方案2】:

只需使用QWidget*QObject*(如果它不总是小部件)作为参数类型

signals:
    void writeToTextEdit(const QString &what, QWidget *where)

或者如果它总是一个QTextEdit 更具体

signals:
    void writeToTextEdit(const QString &what, QTextEdit *where)

虽然不清楚为什么代码可以访问目标对象时需要发出信号,但它可以直接调用setText

【讨论】:

  • 嗯,它没有,gui 类是接收者,而另一个类没有访问权限。好的,您的解决方案是这样,但是当我不想创建新的 QTextEdit 或 QWidget 时,我将如何发出它。你知道我的意思吗?
  • 真的取决于你的目标是什么。如果您想创建一个新对象并让接收者将其添加到其布局中,那么可以。但在这种情况下,您可以只发出新的小部件并在之前设置其内容。但是从阅读 cmets 的问题来看,情况似乎并非如此。如果您只有不同类型的输出,我会同意 G.M.并且 thuga 你应该让源决定类型和目标如何处理它们。通过类型的不同信号或通过具有类型参数,接收器可以打开
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 2020-03-12
  • 2019-04-25
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多