Search code examples
qtcontainerssignals-slots

Qt Passing signal from Item to a container


I have a QVector of pointers to type X, whose items, i.e. X's own QProcesses. These processes can terminate at arbitrary time. Now, I have constructed signal-slot connection inside class X when a process ends. However, I want to propagate it to the handler class which has a QVector of X* as a member. What is an elegant way for doing this?


Solution

  • You can connect a signal to a signal, hiding the source signal being an implementation detail:

    class MyInterface : public QObject {
      Q_OBJECT
      ...
      QProcess m_process;
    public:
      Q_SIGNAL void processEnded();
      MyInterface(QObject * parent = 0) : QObject(parent) {
        connect(&QProcess, &QProcess::finished, this, &MyInterface::processEnded);
        ...
      }
    };
    

    The handler class can listen to these signals and do something with them.

    class Handler : public QObject {
      Q_OBJECT
      QVector<MyInterface*> m_ifaces; // owned by QObject, not by the vector
      void addInterface(MyInterface* ifc) {
        ifc->setParent(this);
        connect(ifc, &MyInterface::processEnded, this, [this, ifc]{
          processEnded(ifc); 
        });
        m_ifaces.append(ifc);
      }
      void processEnded(MyInterface* ifc) {
        // handle the ending of a process
        ...
      }
      ...
    };