8

我的原始代码将一个 QStringList 从信号传递到插槽,然后返回一个 QList。一切正常,但我需要将 QStringList 和 QList 都更改为 2 个不同的子类 QObject。从那以后,我一直收到诸如“此处首先需要合成方法”之类的错误,或者它只是崩溃而没有任何错误消息。

我知道 qt 会复制队列连接中传递的所有参数,并且无法复制 qobject。因此,我认为我会在发出信号之前创建两个 qobject,而不是返回一个 qobject。然后我将传递对每个对象的引用,在槽函数中修改其中一个并取消返回值。不幸的是,无论我如何编码信号和槽函数,应用程序仍然崩溃。如何编码信号/槽函数并将它们连接以将两个 qobjects 作为参数传递或返回 qobject?

MyQObject1 obj1("a","b","c");
MyQObject2 obj2();
emit sendSignal(&obj1, &obj2);
// or
MyQObject2 obj2 = emit sendSignal(&obj1);

connect(someObj, SIGNAL(sendSignal(const QObject&)), this, SLOT(receiveSignal(const QObject&)));

receiveSignal() 函数不直接创建或修改任何 qobject。它必须首先将 qobjects 传递给另一个函数,该函数然后修改 obj2 或创建并返回它。任何代码示例将不胜感激。

4

1 回答 1

12

通常QObject是指针传递,而不是引用传递(注意QObject不能复制也不能传值)。QObject*默认情况下注册为元类型。因此,创建一个带有QObject*参数的信号和一个槽就足以让它们工作:

private slots:
  void test_slot(QObject* object);

signals:
  void test_signal(QObject* object);

初始化:

connect(this, SIGNAL(test_signal(QObject*)), this, SLOT(test_slot(QObject*)));

发射:

QObject* object = new QObject();
emit test_signal(object);

当然,信号和时隙可以属于不同的类别。

于 2013-08-02T20:34:56.913 回答