Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QObject::connect: signal not found in promoted widget with Lambda syntax
Forum Updated to NodeBB v4.3 + New Features

QObject::connect: signal not found in promoted widget with Lambda syntax

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 6 Posters 4.0k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JKSHJ Offline
    JKSHJ Offline
    JKSH
    Moderators
    wrote on last edited by
    #6

    Quick test: Create a dummy class that inherits QObject (not a promoted QWidget!) and also give it a signal void deleteRequest(QVector<int> uids). Instantiate this dummy class and try to connect this dummy signal to your lambda.

    Does it work?

    Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

    Taz742T 1 Reply Last reply
    3
    • JKSHJ JKSH

      Quick test: Create a dummy class that inherits QObject (not a promoted QWidget!) and also give it a signal void deleteRequest(QVector<int> uids). Instantiate this dummy class and try to connect this dummy signal to your lambda.

      Does it work?

      Taz742T Offline
      Taz742T Offline
      Taz742
      wrote on last edited by
      #7

      Guys... I dont know why but my CustomTreeWidget class have a UI. Should it be? :D

      Do what you want.

      jsulmJ 1 Reply Last reply
      0
      • Taz742T Taz742

        Guys... I dont know why but my CustomTreeWidget class have a UI. Should it be? :D

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #8

        @Taz742 said in QObject::connect: signal not found in promoted widget with Lambda syntax:

        I dont know why but my CustomTreeWidget class have a UI

        What do you mean? It is a GUI class, so it has a UI. Or do you mean it has ui member variable?

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • J.HilkJ Offline
          J.HilkJ Offline
          J.Hilk
          Moderators
          wrote on last edited by
          #9

          Hi,
          have you registered QVector as a metatype - using qRegisterMetaType, to use it via Signal/Slots?


          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


          Q: What's that?
          A: It's blue light.
          Q: What does it do?
          A: It turns blue.

          Taz742T 1 Reply Last reply
          0
          • J.HilkJ J.Hilk

            Hi,
            have you registered QVector as a metatype - using qRegisterMetaType, to use it via Signal/Slots?

            Taz742T Offline
            Taz742T Offline
            Taz742
            wrote on last edited by Taz742
            #10

            @J.Hilk
            In main.cpp

                qRegisterMetaType<QVector<int>>("QVector<int>");
            

            Now i am tryng but have a same situation.

            Do what you want.

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #11

              Hi,

              here's a dummy example:

              #include <QtCore>
              #include <QtDebug>
              
              class MyClass : public QObject
              {
                  Q_OBJECT
              
              signals:
                  void deleteRequest(QVector<int> uids);
                  void done();
              
              public slots:
                  void trigger()
                  {
                      emit deleteRequest(QVector<int>{1, 2, 3, 4});
                      QTimer::singleShot(1000, this, &MyClass::done);
                  }
              };
              
              int main(int argc, char** argv)
              {
                  QCoreApplication app(argc, argv);
              
                  MyClass mc;
                  QTimer::singleShot(1000, &mc, &MyClass::trigger);
                  QObject::connect(&mc, &MyClass::done, qApp, &QCoreApplication::quit);
                  QObject::connect(&mc, &MyClass::deleteRequest, [](const QVector<int>& data) { qDebug() << data; });
                  return app.exec();
              }
              
              #include "main.moc"
              

              The content of the QVector is printed after one second and the application ends after another one. Does it work on your machine ?

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              Taz742T 2 Replies Last reply
              1
              • SGaistS SGaist

                Hi,

                here's a dummy example:

                #include <QtCore>
                #include <QtDebug>
                
                class MyClass : public QObject
                {
                    Q_OBJECT
                
                signals:
                    void deleteRequest(QVector<int> uids);
                    void done();
                
                public slots:
                    void trigger()
                    {
                        emit deleteRequest(QVector<int>{1, 2, 3, 4});
                        QTimer::singleShot(1000, this, &MyClass::done);
                    }
                };
                
                int main(int argc, char** argv)
                {
                    QCoreApplication app(argc, argv);
                
                    MyClass mc;
                    QTimer::singleShot(1000, &mc, &MyClass::trigger);
                    QObject::connect(&mc, &MyClass::done, qApp, &QCoreApplication::quit);
                    QObject::connect(&mc, &MyClass::deleteRequest, [](const QVector<int>& data) { qDebug() << data; });
                    return app.exec();
                }
                
                #include "main.moc"
                

                The content of the QVector is printed after one second and the application ends after another one. Does it work on your machine ?

                Taz742T Offline
                Taz742T Offline
                Taz742
                wrote on last edited by
                #12

                @SGaist
                Yes its work. I am also tryed to create new project, move my CustomTreeWidget and work there.

                Do what you want.

                1 Reply Last reply
                0
                • SGaistS SGaist

                  Hi,

                  here's a dummy example:

                  #include <QtCore>
                  #include <QtDebug>
                  
                  class MyClass : public QObject
                  {
                      Q_OBJECT
                  
                  signals:
                      void deleteRequest(QVector<int> uids);
                      void done();
                  
                  public slots:
                      void trigger()
                      {
                          emit deleteRequest(QVector<int>{1, 2, 3, 4});
                          QTimer::singleShot(1000, this, &MyClass::done);
                      }
                  };
                  
                  int main(int argc, char** argv)
                  {
                      QCoreApplication app(argc, argv);
                  
                      MyClass mc;
                      QTimer::singleShot(1000, &mc, &MyClass::trigger);
                      QObject::connect(&mc, &MyClass::done, qApp, &QCoreApplication::quit);
                      QObject::connect(&mc, &MyClass::deleteRequest, [](const QVector<int>& data) { qDebug() << data; });
                      return app.exec();
                  }
                  
                  #include "main.moc"
                  

                  The content of the QVector is printed after one second and the application ends after another one. Does it work on your machine ?

                  Taz742T Offline
                  Taz742T Offline
                  Taz742
                  wrote on last edited by Taz742
                  #13

                  @SGaist
                  I have a same situation in other class.
                  Can you check this example?

                  #ifndef IMAGEWORKER_H
                  #define IMAGEWORKER_H
                  
                  #include <QObject>
                  #include "QDebug"
                  #include "globalhelper.h"
                  #include "QThread"
                  #include "QMutex"
                  #include "QFile"
                  #include "QDir"
                  #include "QCryptographicHash"
                  #include "QByteArray"
                  
                  class ImageWorker : public QObject
                  {
                      Q_OBJECT
                  public:
                      explicit ImageWorker(QObject *parent = 0) {
                          Q_UNUSED(parent);
                          QThread *thread = new QThread;
                          this->moveToThread(thread);
                          connect(thread, &QThread::started, this, &ImageWorker::doWork);
                          connect(this, &ImageWorker::finished, thread, &QThread::quit);
                          connect(this, &ImageWorker::finished, this, &ImageWorker::deleteLater);
                          connect(thread, &QThread::finished, thread, &QThread::deleteLater);
                          thread->start();
                      }
                  
                      ~ImageWorker() {
                          qDebug() << "ImageWorker deleted";
                      }
                  
                  signals:
                      void finished();
                  
                  public slots:
                      void doWork() {
                          emit finished();
                      }
                  
                  private:
                      bool compareImages(const QByteArray &myImage, const QByteArray &serverImage) const
                      {
                          return myImage.toHex() == serverImage.toHex();
                      }
                  
                      QByteArray fileChecksum(const QByteArray &bytes, QCryptographicHash::Algorithm hashAlgorithm = QCryptographicHash::Md5) const
                      {
                          QCryptographicHash hash(hashAlgorithm);
                          hash.addData(bytes);
                          return hash.result();
                      }
                  
                  };
                  
                  
                  #endif // IMAGEWORKER_H
                  
                  

                  Do what you want.

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #14

                    Since you implement the constructor in your derived class, why don't you call the base class constructor ?

                    What exact situation do you have ?

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    Taz742T 1 Reply Last reply
                    0
                    • SGaistS SGaist

                      Since you implement the constructor in your derived class, why don't you call the base class constructor ?

                      What exact situation do you have ?

                      Taz742T Offline
                      Taz742T Offline
                      Taz742
                      wrote on last edited by Taz742
                      #15

                      @SGaist said in QObject::connect: signal not found in promoted widget with Lambda syntax:

                      Since you implement the constructor in your derived class, why don't you call the base class constructor ?

                      I dont understood...

                      @SGaist said in QObject::connect: signal not found in promoted widget with Lambda syntax:

                      What exact situation do you have ?

                      QObject::connect: signal not found in ImageWorker
                      QObject::connect: signal not found in ImageWorker
                      

                      I am debuging it and its happen here:

                              connect(this, &ImageWorker::finished, thread, &QThread::quit);
                              connect(this, &ImageWorker::finished, this, &ImageWorker::deleteLater);
                      

                      Do what you want.

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #16
                        explicit ImageWorker(QObject *parent = 0)
                                : QObject(parent)
                            {
                                QThread *thread = new QThread;
                               etc.
                        

                        I removed #include "globalhelper.h" and it build successfully on macOS.

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        Taz742T 1 Reply Last reply
                        0
                        • SGaistS SGaist
                          explicit ImageWorker(QObject *parent = 0)
                                  : QObject(parent)
                              {
                                  QThread *thread = new QThread;
                                 etc.
                          

                          I removed #include "globalhelper.h" and it build successfully on macOS.

                          Taz742T Offline
                          Taz742T Offline
                          Taz742
                          wrote on last edited by Taz742
                          #17

                          @SGaist
                          There is great uncertainty... I changed

                          @Taz742 said in QObject::connect: signal not found in promoted widget with Lambda syntax:

                              connect(this, &ImageWorker::finished, thread, &QThread::quit);
                              connect(this, &ImageWorker::finished, this, &ImageWorker::deleteLater);
                          

                          to

                                  connect(this, SIGNAL(workerFinished()), thread, SLOT(quit()));
                                  connect(this, SIGNAL(workerFinished()), this, SLOT(deleteLater()));
                          

                          its work...

                          Do what you want.

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved