阻止执行插槽

时间:2017-11-29 13:06:36

标签: c++ qt qt5

在Qt中,我可以emit一个信号,我连接了多个插槽,在直接连接的情况下,连接的插槽会一个接一个地调用。

void mySignal(int x)成为班级MyClass的信号。

根据x的值,我想执行不同的操作,并且在假设下,我想做一个操作,我可以连接一个插槽,用switch-case构造来执行相关行动。

这意味着我需要事先知道我能得到什么样的价值,以及行动是什么。

我还可以为每个操作连接一个插槽,并通过if子句保护执行。现在我可以随时连接任何我想要的东西。但是假设我想做一个动作,如果我能够停止进一步执行插槽,那么当我找到'匹配'时,这对性能有益。

[...]
QObject::connect(this, &MyClass::mySignal, this, [this](int x) {
    if (x == 0) {
        qDebug() << x; // Stop it now!;
    }
});
QObject::connect(this, &MyClass::mySignal, this, [this](int x) {
    if (x == 4) {
        qDebug() << x; // Stop it now!;
    }
});
QObject::connect(this, &MyClass::mySignal, this, [this](int x) {
    if (x == 109) {
        qDebug() << x; // Stop it now!; 
    }
});
  

有没有办法,告诉信号,不再执行插槽,直到再次发出信号

1 个答案:

答案 0 :(得分:0)

使用Qt框架执行此类操作,(ab)的一种方法是使用QEvent - 系统。

信号处理程序不会比在QEvent中转换信号做更多的事情。而不是所有单独的插槽,安装eventFilter。如果eventFilter接受该事件,请返回true以停止传播到其他(过滤器)对象。

  

代码只是一个快速而肮脏的测试,没有安全预防措施。它可能很容易崩溃。

// testevent.h

#ifndef TESTEVENT_H
#define TESTEVENT_H

#include <QObject>
#include <QEvent>

class TestEvent: public QEvent
{
    int m_x;
public:
    TestEvent(int x = 0);
    int x() { return m_x; }

};

class TestEventFilter: public QObject
{
    Q_OBJECT
    int m_fx;
public:
    TestEventFilter(int fx, QObject* parent = nullptr);
    bool eventFilter(QObject* obj, QEvent* event) Q_DECL_OVERRIDE;
}; 
Q_DECLARE_METATYPE(TestEvent)

#endif // TESTEVENT_H

// testevent.cpp

#include "testevent.h"
#include <QDebug>

TestEvent::TestEvent(int x)
    : QEvent(QEvent::User)
    , m_x(x)
{
}

TestEventFilter::TestEventFilter(int fx, QObject *parent)
    : QObject(parent)
    , m_fx(fx)
{
}

bool TestEventFilter::eventFilter(QObject *obj, QEvent *event)
{
    Q_UNUSED(obj);
    TestEvent* e = static_cast<TestEvent*>(event);
    qDebug() << "EventFilter for" << m_fx << "got" << e;
    if (e->x() == m_fx) {
        qDebug() << "accept that event!";
        event->accept();
        return true;
    }
    event->ignore();
    return false;
}

//运行

QObject o;

TestEventFilter* f1 = new TestEventFilter(10);
TestEventFilter* f2 = new TestEventFilter(5);
TestEventFilter* f3 = new TestEventFilter(3);
TestEventFilter* f4 = new TestEventFilter(7);

o.installEventFilter(f1);
o.installEventFilter(f2);
o.installEventFilter(f3);
o.installEventFilter(f4);

qApp->sendEvent(&o, new TestEvent(5));
qApp->sendEvent(&o, new TestEvent(3));

输出:

  

7的EventFilter得到0x369f2fe0
  EventFilter for 3得到0x369f2fe0
  EventFilter for 5得到0x369f2fe0
  接受那个事件!
  EventFilter for 7得到0x369f3250
  EventFilter for 3得到0x369f3250
  接受那个活动!