在接收到信号后,我不得不调用对象的时隙(只需将信号转发到对方的对象时隙)。我知道我可以简单地实现插槽,从身体调用另一个插槽,但也许我可以用更简单的方式来实现它?
下面是示例代码:
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的时隙(转发信号)。
发布于 2017-06-17 11:23:08
您可以将信号连接到两个插槽,它们都将按照连接它们的顺序被调用。
发布于 2017-06-17 11:26:33
如果需要调用多个插槽,这是非常有用的:
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();
};发布于 2017-06-18 12:47:48
正如ctinka所建议的,将SomeController::processText定义为信号是正确的解决方案。
Qt信号和插槽文档中明确指出,您可以将一个信号连接到另一个信号:
甚至可以将一个信号直接连接到另一个信号。(每当发出第一个信号时,这将立即发出第二个信号。)
进一步考虑
注意,插槽是正常的C++函数,所以Qt无法执行任何特殊的逻辑(比如调用连接的插槽):
插槽是正常的C++函数,可以正常调用;它们唯一的特点是信号可以连接到它们。
另一方面,信号是由Qt (moc)生成的,因此能够调用连接的插槽:
信号由moc自动生成,不能在.cpp文件中实现。
https://stackoverflow.com/questions/44603901
复制相似问题