【问题标题】:how to pass qobject as argument from signal to slot in qt connect如何将qobject作为参数从信号传递到qt connect中的插槽
【发布时间】:2013-08-02 19:56:51
【问题描述】:

我的原始代码将一个 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 或创建并返回它。任何代码示例将不胜感激。

【问题讨论】:

    标签: qt signals connect qobject slot


    【解决方案1】:

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

    当然,信号和槽可以属于不同的类。

    【讨论】:

    • 您不需要为信号/插槽进行任何元类型注册,除非连接是排队。对于排队连接,我看到object 的所有权问题。谁拥有它并将再次删除它?发射器?什么时候?
    • QObject* 是一个通用元类型。它默认注册并被一些内置信号使用(例如destroyed)。无需注册,排队连接也能正常工作。 QObject 的所有权是通过设置其父级来声明的(除非它是在堆栈上创建的)。通过指针传递它通常不会导致所有权问题,并且在 Qt API 中被广泛使用。通常 API 中有约定,当调用方法(插槽)时,所有权会发生什么。
    • 元类型:我知道,那不是我的意思。您说QObject* 已注册为元类型,因此可以在信号/插槽中使用。但这不是强制性的;如果是这样,传递 MyObjectSubclass* 的参数已经失败,而无需注册 MyObjectSubclass*
    • 所有权:问题是父/子所有权不会帮助您处理信号/插槽,尤其是排队连接。因此,出于充分的理由,动态创建 QObjects 然后通过信号发送它们并不是常见的做法。接收者不能拥有该对象,因为可以有任意多个接收者或根本没有。在发送者中,如果每次发出test_signal() 时都会创建另一个,则它们将堆叠起来,除非发送者随后立即删除它们(但在队列连接中使用时指针会悬空)。
    • 如果您使用排队连接,并且接收者可能比发送者更长寿,那么它也无法删除对象。因此,在某些情况下,通过共享指针管理对象并传递 QSharedPointer 可能是最好的方法。或者只是不使用信号/插槽来解决问题,它看起来在这里被误用了。
    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多