【问题标题】:Is there a way trigger a signal from another signal in Qt?有没有办法从 Qt 中的另一个信号触发信号?
【发布时间】:2015-10-07 13:06:56
【问题描述】:

我已经有一个应用程序,现在正在调整它。在这方面,我引入了一个新信号,它必须在另一个信号发出时发出。这在 Qt 中可能吗?

编写一个插槽只是为了发出这个信号感觉如此原始和蹩脚......

进一步详细说明,我必须将按钮 signalClicked() 连接到我自己的信号,比如 sendSignal(enumtype)...

编辑:忘了说我需要用第二个信号发送数据。

【问题讨论】:

标签: qt signals-slots


【解决方案1】:

是的,可以不创建额外的插槽。只需将信号连接到信号:

connect(this,SIGNAL(someSignal()),this,SIGNAL(anotherSignal()));

More information in doc.

编辑:

您可以像往常一样共享相关数据。肮脏的例子:

QWidget* obj = new QWidget;
obj->setWindowTitle("WindowTitle");
//share data, pass wrong data to the signal
QObject::connect(obj,SIGNAL(objectNameChanged(QString)),obj,SIGNAL(windowTitleChanged(QString)));
QObject::connect(obj,&QWidget::windowTitleChanged,[](QString str) {qDebug() << str;});
obj->setObjectName("ObjectName");
qDebug() << "But window title is"<< obj->windowTitle();
obj->show();

输出是:

"ObjectName" 
But window title is "WindowTitle" 

但是没有办法做这样的事情:

connect(this,SIGNAL(someSignal()),this,SIGNAL(anotherSignal("with custom data")));

在这种情况下,您需要一个单独的插槽。

【讨论】:

  • 感谢您的回答。我忘了添加一个细节。请查看我的编辑。
  • 类似connect(this,SIGNAL(someSignal()),this,SIGNAL(anotherSignal("with custom data")));的东西可以使用QSignalMapper来完成
  • QSignalMapper 已过时,但其文档显示了一种使用 lambda 的方法:connect(button, &amp;QPushButton::clicked, [=] { clicked(text); });doc.qt.io/qt-5/qsignalmapper.html#details
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多