如何通过信号和槽传递参数?
Posted
技术标签:
【中文标题】如何通过信号和槽传递参数?【英文标题】:How to pass argument through signal and slots? 【发布时间】:2013-04-11 02:02:01 【问题描述】:我的 GUI 由 LineEdit 和 PushButton 组成。单击 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,那么您可能需要重新考虑设计。可能会出现令人讨厌的问题。以上是关于如何通过信号和槽传递参数?的主要内容,如果未能解决你的问题,请参考以下文章