如何通过信号和槽传递参数?

Posted

技术标签:

【中文标题】如何通过信号和槽传递参数?【英文标题】:How to pass argument through signal and slots? 【发布时间】:2013-04-11 02:02:01 【问题描述】:

我的 GUI 由 LineEditPushButton 组成。单击 PushButton 时,将调用插槽 clicked()。我想在clicked() 作为信号和doSomething() 作为插槽之间建立信号-插槽关系。问题是doSomething() 无法访问 UI,doSomething() 依赖于 LineEdit 的文本才能工作。

我看到了两种解决方案:

    授予对 UI 的 doSomething() 访问权限。

    我希望能够将 QString 作为参数传递给 doSomething()。 clicked() 不接受任何参数。 Qsignalmapper 可能是我正在寻找的。但是,映射器似乎只根据信号传递参数。因此需要提前设置参数,这似乎对我没有帮助。

我将如何做解决方案 2?

【问题讨论】:

【参考方案1】:

假设使用 C++ 解决方案,您可能会考虑为 #2 使用如下中间信号:

connect(thisWidget, SIGNAL(clicked()),
        thisWidget, SLOT(slotClickHandler()));

然后:

void slotClickHandler()

   QString s = "my variable string here";

  emit sigDoSomething(s);

还有他们:

void slotDoSomething(const QString &s)

   // Do something interesting with s here


请注意,此 sn-p 假设您已经定义了一个新信号 sigDoSomething(const QString &) 和一个私有插槽 void slotDoSomething(const QString &)

【讨论】:

太棒了!你说哪个更干净?方法一还是方法二?这取决于,对吧?方法 2 的问题是,当您处理大量 GUI 元素时,重复信号/插槽的数量会变得混乱,对吗?另外,为什么是 const QString &s?不应该只是 QString 吗? 正如您所说,“更清洁”取决于。清洁工是什么意思?更容易阅读?更容易调试?在编译器上更容易?开发人员通常是最薄弱的环节,因此相应地偏向“更清洁”。将信号和槽清楚地映射到它们各自的小部件(具有有意义的名称等)。让 QT moc 和 gcc 担心调用次数。无论如何,简单的链式函数调用都可能会被优化。最后,看似重复的调用将取决于您的实现:有多少个按钮?他们究竟需要传达什么>?等 至于 const QString &,我假设 slot 实现不需要修改 QString 。如果是这样,按值传递(即 QString s)将制作 QString 对象的不必要副本。另一方面,通过引用传递 QString (QString &) 允许编译器传递更有效的引用(本质上是指向对象的指针)。添加 const 限定符可确保编译器知道 QString 不会被修改。 (实际上,如果您尝试修改 const 对象,编译器会断言错误)。 如果您希望插槽修改 QString,那么您可能需要重新考虑设计。可能会出现令人讨厌的问题。

以上是关于如何通过信号和槽传递参数?的主要内容,如果未能解决你的问题,请参考以下文章

QT编程中信号与槽遇到的参数传递问题,如下

通过 QT 的信号/槽系统作为参数传递通用异常

Qt 槽函数怎么传递参数

Qt信号槽如何附带自定义参数

qt 关于信号槽传递的参数问题

Qt中信号槽形参值传递,引用传递,指针传递的实例及总结