我遇到的情况是我必须在接收信号后调用对象的插槽(只需将信号转发到另一个对象插槽)。我知道我可以简单地实现插槽并从主体调用另一个插槽,但也许我可以用更简单的方式做到这一点?
以下是示例代码:
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
联系,因为我想要隐藏我甚至使用{{{ 1}}。对于SomeUtil
用户,此类应该是不可见的。这是一个封装问题。 SomeController
是一种外观。
更重要的是,我不需要实施SomeController
的广告位。唯一的工作就是拨打SomeController
的广告位(转发信号)。
答案 0 :(得分:0)
您可以将信号连接到两个插槽,然后按照连接顺序调用它们。
答案 1 :(得分:0)
回答你的问题:你可以逐个建立两个连接,并按相同的顺序调用插槽
之类的东西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);
但是如果你需要调用同一个类的私有成员函数 - 你需要创建包装器插槽:
class SomeController : public QObject
{
Q_OBJECT
public slots:
void processText(QString);
{
foo();
bar();
}
private:
void foo();
void bar();
};
答案 2 :(得分:0)
正如ctinka所建议的那样,将SomeController::processText
定义为信号是正确的解决方案。
在Qt Signals & Slots documentation中明确指出,您可以将信号连接到另一个信号:
甚至可以将信号直接连接到另一个信号。 (每当第一个信号发出时,它会立即发出第二个信号 发射。)
进一步考虑
请注意,插槽是普通的C ++函数,因此Qt无法执行任何特殊逻辑(如调用连接的插槽):
插槽是普通的C ++函数,可以正常调用;他们唯一的 特殊功能是信号可以连接到它们。
另一方面,信号由Qt(moc
)生成,因此可以调用连接的插槽:
信号由moc自动生成,不得为 在.cpp文件中实现。