在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!;
}
});
有没有办法,告诉信号,不再执行插槽,直到再次发出信号?
答案 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
接受那个活动!