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. Connecting to statusBar()->showMessage gives compile time error in new syntax
Forum Updated to NodeBB v4.3 + New Features

Connecting to statusBar()->showMessage gives compile time error in new syntax

Scheduled Pinned Locked Moved Solved General and Desktop
16 Posts 6 Posters 1.4k Views 1 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.
  • O ofmrew

    @jonb

    Here is a lambda I use to create a QString for statusBar:

        connect(ui->unitVector, &QPushButton::clicked, [=](){
                                                    ui->canvas->go.setFlagAndResetAngle(4);
                                                    QString s;
                                                    s.append("Rotation about Unit Vector ");
                                                    s.append(ui->canvas->go.uv.toString());
                                                    ui->statusBar->showMessage(s, 0);});
    
    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by
    #7

    @ofmrew
    But @sandro4912 is asking

    how to pass the string send from transactionStarted to statusBar()->showMessage()

    hence my suggestion; how is yours to do with passing a parameter on to the lambda??

    1 Reply Last reply
    0
    • JonBJ JonB

      @sandro4912
      I'm throwing my hat in because I'm not C++, but don't you do that by specifying the lambda as:

      connect(&thread, &TransactionThread::transactionStarted, [=](const QString &text)
          {
              statusBar()->showMessage(text);  // how to enter the text send with transactionStarted?
          });
      
      
      J.HilkJ Online
      J.HilkJ Online
      J.Hilk
      Moderators
      wrote on last edited by
      #8

      @jonb said in Connecting to statusBar()->showMessage gives compile time error in new syntax:

      @sandro4912
      I'm throwing my hat in because I'm not C++, but don't you do that by specifying the lambda as:

      connect(&thread, &TransactionThread::transactionStarted, [=](const QString &text)
          {
              statusBar()->showMessage(text);  // how to enter the text send with transactionStarted?
          });
      
      

      absolutely correct!👍
      just one caveat, you can, but you shall not omit the return type

      connect(&thread, &TransactionThread::transactionStarted, [=](const QString &text)->void{});
      

      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.

      JonBJ 1 Reply Last reply
      3
      • J.HilkJ J.Hilk

        @jonb said in Connecting to statusBar()->showMessage gives compile time error in new syntax:

        @sandro4912
        I'm throwing my hat in because I'm not C++, but don't you do that by specifying the lambda as:

        connect(&thread, &TransactionThread::transactionStarted, [=](const QString &text)
            {
                statusBar()->showMessage(text);  // how to enter the text send with transactionStarted?
            });
        
        

        absolutely correct!👍
        just one caveat, you can, but you shall not omit the return type

        connect(&thread, &TransactionThread::transactionStarted, [=](const QString &text)->void{});
        
        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #9

        @j-hilk
        So now C++ has found another use for ->! And I assume the [=] is an array holding this as the context or something, is that a special meaning for the =?

        I realize this isn't the place for long discussion, but ISTM with these lambdas C++ is using a lot of cryptic symbols all together!

        J.HilkJ 1 Reply Last reply
        1
        • S Offline
          S Offline
          sandro4912
          wrote on last edited by sandro4912
          #10

          @jonb said in Connecting to statusBar()->showMessage gives compile time error in new syntax:

          [=]

          [=] means that all the variables / objects are also available in the lamda body for usage. you can also specify there just a single variable from the outside.

          for more see this: https://de.cppreference.com/w/cpp/language/lambda

          the -> you can also use it for normal functions now hence its not that common.

          for example int somefunction(); becomes auto someFunction() -> int

          Anyway guys thanks for the solution

          1 Reply Last reply
          2
          • JonBJ JonB

            @j-hilk
            So now C++ has found another use for ->! And I assume the [=] is an array holding this as the context or something, is that a special meaning for the =?

            I realize this isn't the place for long discussion, but ISTM with these lambdas C++ is using a lot of cryptic symbols all together!

            J.HilkJ Online
            J.HilkJ Online
            J.Hilk
            Moderators
            wrote on last edited by
            #11

            @jonb
            well, i‘m not sure what exactly the compiler does, but I assume you‘re on the right path:

            [&epsilon] capture by reference
            [&] captures all variables used in the lambda by reference
            [=] captures all variables used in the lambda by value
            [&, epsilon] captures variables like with [&], but epsilon by value
            [=, &epsilon] captures variables like with [=], but epsilon by reference

            which makes this lambda actually dangerous as the statusbar could be deleted at any time, qt offers a solution for this:

            connect(&thread, &TransactionThread::transactionStarted, statusbar, [=](const QString &text)->void{});
            

            the connect get becomes resolved, when statusbar gets deleted

            but from the naming of the variables I would say that the emitter is actually in a different thread compared to statusbar.

            I‘m not sure how Qt handles this with a Lambda, probably not good, therefore 5th connect paramater is probably a good idea

            connect(&thread, &TransactionThread::transactionStarted, statusbar, [=](const QString &text)->void{},Qt::QueuedConnection);
            

            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.

            O 1 Reply Last reply
            3
            • J.HilkJ J.Hilk

              @jonb
              well, i‘m not sure what exactly the compiler does, but I assume you‘re on the right path:

              [&epsilon] capture by reference
              [&] captures all variables used in the lambda by reference
              [=] captures all variables used in the lambda by value
              [&, epsilon] captures variables like with [&], but epsilon by value
              [=, &epsilon] captures variables like with [=], but epsilon by reference

              which makes this lambda actually dangerous as the statusbar could be deleted at any time, qt offers a solution for this:

              connect(&thread, &TransactionThread::transactionStarted, statusbar, [=](const QString &text)->void{});
              

              the connect get becomes resolved, when statusbar gets deleted

              but from the naming of the variables I would say that the emitter is actually in a different thread compared to statusbar.

              I‘m not sure how Qt handles this with a Lambda, probably not good, therefore 5th connect paramater is probably a good idea

              connect(&thread, &TransactionThread::transactionStarted, statusbar, [=](const QString &text)->void{},Qt::QueuedConnection);
              
              O Offline
              O Offline
              ofmrew
              wrote on last edited by
              #12

              @j-hilk
              I knew that I had seen this before, try link text

              1 Reply Last reply
              0
              • S Offline
                S Offline
                sandro4912
                wrote on last edited by
                #13

                i tryed to add a fifth parameter like you said:

                    connect(&thread, &TransactionThread::transactionStarted, 
                            [=](const QString &text)->void
                    {
                        statusBar()->showMessage(text);  
                    }, Qt::QueuedConnection);
                

                Unfortunatey the syntax is not working with lambda.

                And yes you are right. In the MainWindow were the statusBar is there is thread launced for taskes to be computed in a second thread.

                JonBJ 1 Reply Last reply
                0
                • S sandro4912

                  i tryed to add a fifth parameter like you said:

                      connect(&thread, &TransactionThread::transactionStarted, 
                              [=](const QString &text)->void
                      {
                          statusBar()->showMessage(text);  
                      }, Qt::QueuedConnection);
                  

                  Unfortunatey the syntax is not working with lambda.

                  And yes you are right. In the MainWindow were the statusBar is there is thread launced for taskes to be computed in a second thread.

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by JonB
                  #14

                  @sandro4912

                  i tryed to add a fifth parameter like you said:

                  Count your parameters, you only have 4!
                  Look at @J-Hilk 's code, see what you've missed....

                  O 1 Reply Last reply
                  2
                  • JonBJ JonB

                    @sandro4912

                    i tryed to add a fifth parameter like you said:

                    Count your parameters, you only have 4!
                    Look at @J-Hilk 's code, see what you've missed....

                    O Offline
                    O Offline
                    ofmrew
                    wrote on last edited by
                    #15

                    @jonb

                    Note that the st in [this](const QString& st) is the name of the string that is the argument of the signal, which I use in {this->ui->statusBar->showMessage(st, 0);}

                    O 1 Reply Last reply
                    0
                    • O ofmrew

                      @jonb

                      Note that the st in [this](const QString& st) is the name of the string that is the argument of the signal, which I use in {this->ui->statusBar->showMessage(st, 0);}

                      O Offline
                      O Offline
                      ofmrew
                      wrote on last edited by
                      #16

                      @ofmrew
                      Try this example: ```
                      void canvasResized(QString s);
                      QString st = "It opened";
                      emit canvasResized(st);
                      connect(ui->canvas, &MyCanvas::canvasResized, [this](const QString& st){this->ui->statusBar->showMessage(st, 0);});

                      I added the emit to the resizeEvent and it worked.
                      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