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.
  • Taz742T Offline
    Taz742T Offline
    Taz742
    wrote on last edited by
    #1

    I have an overloaded QTreeWidget class, with my SIGNALS: I have promoted it in my UI and when I listen promoted QTreeWidget object with a lambda syntax I have an error.

    QObject::connect: signal not found in CustomTreeWidget.
    

    MY CustomTreeWidget looks like:

    .h

    class CustomTreeWidget : public QTreeWidget
    {
        Q_OBJECT
    public:
        explicit CustomTreeWidget(QWidget *parent = 0);
    
        ~CustomTreeWidget() {
        }
    
    signals:
        void currentNodeChanged(QSet<int> uids);
        void deleteRequest(QVector<int> uids);
    }
    

    .cpp

    CustomTreeWidget::CustomTreeWidget(QWidget *parent) : QTreeWidget(parent)
    {
        setAnimated(true);
    
        connect(this, &CustomTreeWidget::customContextMenuRequested, this, [=](const QPoint &pos) {
            this->m_bCustomMenuOpen = true;
            const auto &&item = this->itemAt(pos);
    
            QMenu myMenu;
    
            bool ok = !(item) ? false : true;
    
            if (ok) {
            //თუ topLevelItem -ია მხოლოდ დამატების action -ი უნდა იყოს ჩართული.
                if (item == this->topLevelItem(0) || item == this->topLevelItem(0)->child(0)) {
                    ok = false;
                }
            }
    
            QAction *Removecnt = myMenu.addAction(tr("&წაშლა"), this, SLOT(DeleteNode()));
            Removecnt->setIcon(QIcon(":/global_res/delete.png"));
            Removecnt->setEnabled(ok);
    
            myMenu.exec(this->mapToGlobal(pos));
        });
    }
    
    void CustomTreeWidget::BFS(QTreeWidgetItem *item, QSet<int> &out)
    {
        std::queue<QTreeWidgetItem *> Q;
        Q.push(item);
    
        while (!Q.empty()) {
            QTreeWidgetItem *now = Q.front(); Q.pop();
            out.insert(this->m_mapUids[now]);
            for (int i = 0; i < now->childCount(); i++) {
                Q.push(now->child(i));
            }
        }
    }
    
    QSet<int> CustomTreeWidget::GetCurrentNodeUids()
    {
        QSet<int> uids;
        if (!this->currentItem())
            return uids;
    
        this->BFS(this->currentItem(), uids);
        return uids;
    }
    
    void CustomTreeWidget::DeleteNode()
    {
        QSet<int> nodes = this->GetCurrentNodeUids();
        QVector<int> uids;
        for (auto it : nodes) {
            uids.push_back(it);
        }
    
        emit deleteRequest(uids);
    }
    

    My lambda looks like:

    connect(ui->productTree, &CustomTreeWidget::deleteRequest, this, [=](QVector<int> uids) {
        //logic
    });
    

    But this signal works with old syntax.

    connect(ui->productTree, SIGNAL(deleteRequest(QVector<int>)), this, SLOT(checkSlot(QVector<int>)));
    

    And this slot is.

    void ProductForm::checkSlot(QVector<int> uids)
    {
        qDebug() << uids.size();
    }
    

    So what is problem lambda syntax?

    Do what you want.

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2

      Did you include the header of CustomTreeWidget in the ProductForm source file?

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      Taz742T 1 Reply Last reply
      0
      • VRoninV VRonin

        Did you include the header of CustomTreeWidget in the ProductForm source file?

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

        @VRonin
        Yes i have.

        Do what you want.

        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #4

          There's nothing wrong in the code you posted, they only thing I can think of is try using QOverload<>::of in case that's the source of the problem

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          Taz742T 1 Reply Last reply
          2
          • VRoninV VRonin

            There's nothing wrong in the code you posted, they only thing I can think of is try using QOverload<>::of in case that's the source of the problem

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

            @VRonin
            Something like this?

            connect(ui->productTree, static_cast<void (CustomTreeWidget::*)(QVector<int>)>(&CustomTreeWidget::deleteRequest), this, [=](QVector<int> uids) {
                qDebug() << "yeapp";
            });
            

            or

            connect(ui->productTree, QOverload<QVector<int>>::of(&CustomTreeWidget::deleteRequest), this, [=](QVector<int> uids) {
                qDebug() << "yeapp";
            });
            

            Everything is same.

            Do what you want.

            1 Reply Last reply
            0
            • 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