【问题标题】:Qt: How to properly define the signal argument for this code?Qt:如何正确定义此代码的信号参数?
【发布时间】:2017-02-24 22:24:39
【问题描述】:

我在 Ubuntu 14.04 上使用 Qt 4.8。
目前,我有以下代码:

void MyServer::processMessage()
{
   QByteArray data;
   ...

   ...
   emit newMessage(data);
}   

--
定义newMessage 信号的正确方法是什么(在头文件中):

signals:
    void newMessage(const QByteArray & newData);

或:

signals:
    void newMessage(QByteArray newData);

如上所示,信号是在退出 processMessage 函数之前发出的,因此在发出该信号后,QByteArray data 将不再存在...
因此,我对定义信号的第一种方式的担忧是,它作为参数传递了对在发出newMessage 后不再存在的对象(实例)的引用。

提前感谢您的时间和耐心!
顺便说一句:我的应用是单线程的。
PS:如果应用程序是多线程的,情况会有所不同吗?

【问题讨论】:

    标签: qt arguments parameter-passing signals-slots


    【解决方案1】:

    两者都可以,但最常见的版本是

    signals:
        void newMessage(const QByteArray &newData);
    

    关于您对第一个选项的担忧:传递引用只能通过 Qt::DirectConnection 完成(Qt::AutoConnection 基本上导致单线程信号/插槽连接),因为其他人要求信号参数可以存储在QVariant 和引用不是。

    使用这样的Qt::DirectConnection,当所有连接到信号的槽都已执行时,发射将“返回”。 所以此时没有人需要data 对象了。

    【讨论】:

      【解决方案2】:

      如上一个答案'how to pass qobject as argument from signal to slot in qt connect'所述,建议将Object作为指针传递。

      所以,信号声明是:

      signals:
          void newMessage(QByteArray* newData);
      

      信号的发射为:

      void MyServer::processMessage()
      {
         QByteArray data;
         ...
      
         ...
         emit newMessage(&data);
      } 
      

      【讨论】:

      • 如果我没记错的话,QObject 不能被复制,因此不能按值传递......现在你提到了 QObject :)
      • 无论如何,指针或引用 - 对我来说都无所谓(只要我不必按值传递数据对象)。毕竟,引用可以被视为具有自动间接寻址的常量指针(即编译器为您放置 * 运算符)。
      • 请不要这样做,这正是 OP 担心的问题(如果连接类型是 Qt::QueuedConnection)。 QObjects 通常通过它们的指针值传递,因为它们不能通过值传递(它们不可复制)。 QByteArray不是QObject,是可复制的,真的没有理由通过指针传递。
      猜你喜欢
      • 2012-06-26
      • 2012-11-04
      • 2020-06-29
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      相关资源
      最近更新 更多