【发布时间】:2017-06-17 11:10:50
【问题描述】:
我遇到了在接收信号后必须调用对象槽的情况(只需将信号转发到另一个对象槽)。我知道我可以简单地实现插槽并从正文中调用另一个插槽,但也许我可以用更简单的方式来做到这一点?
这里是示例代码:
class SomeWidget : public QObject
{
Q_OBJECT
signals:
textChanged(QString);
//...
};
//----------------------------------------------------------------------
class SomeController : public QObject
{
Q_OBJECT
public slots:
processText(QString);
//...
public:
SomeController()
{
connect(this, &SomeController::processText, &someUtil, &SomeUtil::processText);
//^^ this won't work, linker can not find SomeController::processText
}
private:
SomeUtil someUtil; //doesn't matter, just does something
};
//----------------------------------------------------------------------
//code somewhere else
connect (someWidget, &SomeWidget::textChanged, someController, &SomeController::processText)
编辑:
好的,也许我的问题不够清楚 - 考虑到我的例子 - 我不想直接连接 SomeWidget 和 SomeUtil,因为我想隐藏我什至使用 SomeUtil 的事实。此类对于SomeController 的用户应该是不可见的。这是一个封装问题。 SomeController 是一种门面。
而且我不需要实现SomeController 的槽。唯一的工作就是调用SomeUtil的槽(转发信号)。
【问题讨论】:
-
您可以在 SomeController 类中声明信号,将信号相互连接,以及小部件何时发出 textChanged 信号 - 您的控制器也会发出 processText 信号
-
@ctinka 确实可以,但我不认为这是一个很好的解决方案。信号被认为是“说”而不是“听”的功能。
-
在 Qt 库中可以将信号连接到另一个信号
标签: c++ qt signals-slots