Qt转发插槽/连接插槽到插槽?
我进入了接收信号之后必须调用对象时隙的情况(只是将信号转发到另一个对象时隙)。我知道我可以简单地实现插槽并从身体调用另一个插槽,但是也许我可以以更简单的方式做到这一点?Qt转发插槽/连接插槽到插槽?
这里的示例代码:
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)
编辑:
好吧,也许我的问题是不够清晰 - concidering我的例子 - 我不想与SomeUtil
我直接SomeWidget
连接想要隐藏我甚至使用SomeUtil
的事实。对于SomeController
的用户,此类应该是不可见的。这是一个封装问题。 SomeController
是一种外观。
什么是我不需要执行SomeController
的插槽。唯一的工作是拨打SomeUtil
的插槽(转发信号)。
-
回答你的问题:你可以使两个连接一个接一个和槽会以相同的顺序被称为 像
connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::processText); connect(someWidget, &SomeWidget::textChanged, anotherController, &SomeController::processText);
,如果你需要,这是有益的调用多个插槽:
connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::processText);
connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::update);
,但如果你需要调用同一类的私有成员函数 - 您甲肾上腺素ED使包装槽:
class SomeController : public QObject
{
Q_OBJECT
public slots:
void processText(QString);
{
foo();
bar();
}
private:
void foo();
void bar();
};
- 在您的代码连接到processText信号,但你的类SomeController没有任何信号
谢谢,但看看编辑 – jaskmar
如所建议的通过ctinka,定义SomeController::processText
作为一个信号是正确的解决方案。
它在Qt Signals & Slots documentation明确指出,你可将信号连接到另一个信号:
到信号直接连接到其他信号甚至可能。 (这将发射第二信号立即每当第一是 射出。)
进一步考虑
注意,时隙是正常的C++函数,所以Qt是不能够执行任何特殊的逻辑(像调用连接的插槽):
插槽是正常的C++函数,可以正常调用;他们唯一的 特殊功能是信号可以连接到他们。
在另一方面,被Qt(moc
)产生的信号,并因此是能够调用连接槽:
的信号由MOC自动生成,并且必须不能在实现 。 cpp文件。
你可以在SomeController类中声明的信号,信号的相互连接,当小部件会发出信号框TextChanged - 控制器会发出processText信号过 – ctinka
@ctinka的确,我可以,但我不认为这是一个不错的解。信号被认为是“说话”而不是“听”的功能。 – jaskmar
在Qt库它可以连接到另一个信号 – ctinka