【问题标题】:Emit a signal on a QQuickItem reference在 QQuickItem 引用上发出信号
【发布时间】: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-&gt;huzzah()。但是,如果您将 Foo 存储为 QQuickItem(foo 的类型为 QQuickItem *),您将无法直接执行此操作,因为编译器完全不知道 foo 具有该信号。因此,要么将其存储为Foo *,要么您需要向下转换(qobject_cast 如果foo 可能不是Foo,您需要检查结果,static_cast 如果您确定它是,但同样,如果您确定为什么不首先使用正确的类型进行存储?)
  • 谢谢,@peppe。我也不确定为什么它是通用的QQuickItem。我替换了它以使其更具体,并且您的语法完美无缺。我可以建议您将您的评论变成答案,以便我可以接受它(并在此过程中给您代表)?

标签: c++ qt qml


【解决方案1】:

更新class Bar。而不是QQuickItem *foo; 使用Foo *foo;

class Bar: public QObject {
...
private:
  Foo *foo;
};

//and emit the signal
void Bar::BeforeRender() {
  emit foo->huzzah();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2018-09-04
    • 2017-10-13
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多