Qt QThread trouble using signal/slot going from worker to gui

前端 未结 2 753
说谎
说谎 2021-01-24 02:37

I have a Qt application that was developed using Qt Creator and the GUI tool that accompanies it. I have a main thread, TheGui and a worker thread that is created b

相关标签:
2条回答
  • 2021-01-24 03:24

    Sure that connection is actually made? If there are any problems with connect call, there is usually some debugging output about it on cerr.

    Secondly, I think you have a typo - if you copied connect call from your code, then know that you have parenthesis missing around SIGNAL - should be

    connect(&thread, SIGNAL(sendList(string)), this, SLOT(updateTable(string)));
    

    Thirdly, what is that you are passing as signal/slot parameter? Is it std::string? Connections between threads must be queued connections. Queued connections can use as parameters only types declared with Q_DECLARE_METATYPE macro, and registered with qRegisterMetaType. As far as I know, Qt by default doesn't declare those for std::string, as it prefers QString. If you didn't add those to your code, it might be the reason for failure.

    0 讨论(0)
  • 2021-01-24 03:36
    1. Because the signal and the slot are on distinct threads, the connection between them has the Qt::QueuedConnection type. And for queued connections, Qt has to be able to save a copy of the signal parameters, to pass them later to the slot.
      So, to inform Qt that the type is copyable, you have to register it with Qt's meta-object system (see QMetaType) like this:

      // This macro call should be put in one of your .h files 
      Q_DECLARE_METATYPE(std::string)
      
      // You should call this function before any (queued) 
      // signal/slot connection involving the type
      qRegisterMetaType<std::string>();
      
    2. The parameter name shouldn't be included in the QObject::connect call, and the type names should be exactly the same as the ones you passed to Q_DECLARE_METATYPE:

      connect(&thread, SIGNAL(sendList(std::string), this, SLOT(updateTable(std::string)));
      

    You can also use QString or QByteArray, which are already registered, instead of std::string, since these functions are slots and signals and as such are already Qt specific.

    0 讨论(0)
提交回复
热议问题