如何在qt connect中将qobject作为参数从信号传递到插槽

时间:2013-08-02 19:56:51

标签: qt signals connect qobject slot

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

我知道qt会复制排队连接中传递的所有参数,并且无法复制qobject。所以我没有返回一个qobject,而是认为我会在发出信号之前创建两个qobjects。然后我将传递对每个对象的引用,在slot函数中修改其中一个并使返回值无效。不幸的是,无论我如何编码信号和插槽功能,应用程序仍会崩溃。如何编码信号/插槽函数并将它们连接到将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或创建并返回它。任何代码示例都将非常感激。

1 个答案:

答案 0 :(得分:11)

通常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);

当然,信号和插槽可以在不同的类别中。