首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt向前插槽/连接插槽到插槽?

Qt向前插槽/连接插槽到插槽?
EN

Stack Overflow用户
提问于 2017-06-17 11:10:50
回答 3查看 5.6K关注 0票数 4

在接收到信号后,我不得不调用对象的时隙(只需将信号转发到对方的对象时隙)。我知道我可以简单地实现插槽,从身体调用另一个插槽,但也许我可以用更简单的方式来实现它?

下面是示例代码:

代码语言:javascript
复制
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)

编辑:

好吧,也许我的问题不够清楚--这是我的例子--我不想直接将SomeWidgetSomeUtil连接起来,因为我想掩盖我甚至使用SomeUtil的事实。对于SomeController的用户来说,这个类应该是不可见的。这是一个封装的问题。SomeController是一种外观。

更重要的是,我不需要实现SomeController的时隙,它的工作只是调用SomeUtil的时隙(转发信号)。

EN

回答 3

Stack Overflow用户

发布于 2017-06-17 11:23:08

您可以将信号连接到两个插槽,它们都将按照连接它们的顺序被调用。

票数 0
EN

Stack Overflow用户

发布于 2017-06-17 11:26:33

  1. 回答您的问题:您可以一个接一个地建立两个连接,然后按相同的顺序调用插槽,如下所示 连接(SomeWidget,&SomeWidget::textChanged,someController,&SomeController::processText);connect(someWidget,&SomeWidget::textChanged,anotherController,&SomeController:processText);

如果需要调用多个插槽,这是非常有用的:

代码语言:javascript
复制
connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::processText);
connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::update);

但是,如果需要调用同一个类的私有成员函数,则需要创建包装槽:

代码语言:javascript
复制
class SomeController : public QObject
{
    Q_OBJECT
public slots:
    void processText(QString);
    {
        foo();
        bar();
    }
private:
    void foo();
    void bar();
};
  1. 在代码中连接到processText信号,但是类SomeController没有任何信号
票数 0
EN

Stack Overflow用户

发布于 2017-06-18 12:47:48

正如ctinka所建议的,将SomeController::processText定义为信号是正确的解决方案。

Qt信号和插槽文档中明确指出,您可以将一个信号连接到另一个信号:

甚至可以将一个信号直接连接到另一个信号。(每当发出第一个信号时,这将立即发出第二个信号。)

进一步考虑

注意,插槽是正常的C++函数,所以Qt无法执行任何特殊的逻辑(比如调用连接的插槽):

插槽是正常的C++函数,可以正常调用;它们唯一的特点是信号可以连接到它们。

另一方面,信号是由Qt (moc)生成的,因此能够调用连接的插槽:

信号由moc自动生成,不能在.cpp文件中实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44603901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档