【发布时间】:2016-07-19 20:26:51
【问题描述】:
我有一个 C++ 类 Bar,它包含对另一个类 Foo 的实例的引用。当调用Bar 上的方法时,我想在Foo 实例上发出QML 信号。我已经 20 年没有用 C++ 编码了,QML 用来发出信号的语法让我感到困惑。
Foo.h
#include <QOpenGLFramebufferObject>
#include <QQuickFramebufferObject>
class Bar;
class Foo : public QQuickFramebufferObject {
Q_OBJECT
public:
Foo();
virtual ~Foo();
signals:
void huzzah();
private:
Bar &bar;
};
Foo.cpp
#include "Foo.h"
...
class Bar: public QObject {
Q_OBJECT
public:
Bar();
~Bar();
void SetItemAttached( QQuickItem &inItem );
public slots:
void BeforeRender();
private:
QQuickItem *foo;
};
void Bar::SetItemAttached( QQuickItem &inItem ) {
foo = &inItem;
}
//************************************************
//* When this method is called I want to emit a
//* signal on foo, not on the bar instance.
//************************************************
void Bar::BeforeRender() {
// I really want something like foo.emit(...)
emit huzzah();
}
Foo::Foo() : bar( *new Bar() ) {
bar.SetItemAttached( *this );
}
Foo::~Foo() {
delete &bar;
}
如何修改上述BeforeRender() 方法中的代码以在foo 上发出信号?
我周围的(QML 新手)C++ 程序员说我必须让Bar 发出一个虚拟信号,然后将其连接到Foo 上的一个插槽,该插槽在Foo 上发出一个信号。这是唯一(或最好)的方法吗?
【问题讨论】:
-
你也可以让 Bar 直接发出 Foo 的信号:
emit foo->huzzah()。但是,如果您将 Foo 存储为 QQuickItem(foo的类型为QQuickItem *),您将无法直接执行此操作,因为编译器完全不知道foo具有该信号。因此,要么将其存储为Foo *,要么您需要向下转换(qobject_cast如果foo可能不是Foo,您需要检查结果,static_cast如果您确定它是,但同样,如果您确定为什么不首先使用正确的类型进行存储?) -
谢谢,@peppe。我也不确定为什么它是通用的
QQuickItem。我替换了它以使其更具体,并且您的语法完美无缺。我可以建议您将您的评论变成答案,以便我可以接受它(并在此过程中给您代表)?