为什么我的连接没有触发信号功能?

时间:2016-03-02 20:55:34

标签: c++ qt

我正在努力学习Qt,并希望从一个小项目开始。

我在项目中添加了一个名为" playPauseButton"的按钮。目前,我正在尝试将它连接到类中的信号,该类应处理所有按钮事件,使用我的SLOT中给出的枚举值确定当前事件。

这是我现在的代码:

connect(ui.playPauseButton, SIGNAL(clicked()), m_uiInit.get(), SLOT(ClickEvents(Buttons::PausePlayButton)));

请注意,m_uiInit是指向其中包含shared_ptr方法的类的ClickEvents()

std::shared_ptr<UIInit> m_uiInit = std::shared_ptr<UIInit>(new UIInit());

我在UIInit类中的插槽如下所示:

标题:

public slots:

    void ClickEvents(Buttons button);

.cpp的:

void UIInit::ClickEvents(Buttons button)
{
    switch (button)
    {
    case Buttons::PausePlayButton:
        //Do something
        break;
    }
}

有人可以向我解释为什么这不起作用吗?

我怀疑它是由于connect()中的第三个参数 - 调用。我经常只用&#34;这&#34;看到它,但我读了它,发现它似乎必须是指向包含SLOT方法的类对象的指针?

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

信号和插槽签名之间存在不一致 - 信号没有参数,插槽需要一个参数。签名必须匹配,如果信号说出int和float参数就可以了,在这种情况下,你可以连接到只接受int参数的槽,并且float将被丢弃。在您的情况下,您将signal(void)slot(enum)相关联,但枚举值来自何处?

而是创建另一个不带参数的插槽并将信号连接到它,并在该插槽中m_uiInit.get()->ClickEvents(Buttons::PausePlayButton);

在Qt中,信号参数在连接时未指定,但在信号发射时指定 - emit someSignal(param)

话虽如此,您可以使用Qt5中提供的新连接语法,并连接到lambda,它将捕获所需的数据。它将类似于创建辅助插槽,但它将是每个按钮的未命名函数(仅适用于Qt5 +):

connect(ui->playPauseButton, &QPushButton::clicked, [=](){ m_uiInit.get()->ClickEvents(Buttons::PausePlayButton); }); 

BTW,ui是指针,因此ui.playPauseButton也是错误的。

答案 1 :(得分:0)

1)如果连接失败,您应该收到运行时警告

2)查看QSignalMapper“应该处理所有按钮事件的类”的内容