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. failed connect
QtWS25 Last Chance

failed connect

Scheduled Pinned Locked Moved Solved General and Desktop
connect failure
12 Posts 4 Posters 4.9k Views
  • 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.
  • N Offline
    N Offline
    nischu
    wrote on last edited by
    #1

    Hello there, I'm trying from a tutorial making a small tictactoe game with Qtcreator. That's my first project with Qt.
    When I run the binary, I get these two messages:

    Starting /home/sven/develop/Qt/build-tictactoe-Desktop_Qt_5_6_0_GCC_64bit-Debug/tictactoe...
    QObject::connect: No such signal TicTacToeWidget::currentPlayerChanged(TicTacToeWidget::Player) in ../tictactoe/mainwindow.cpp:17
    QObject::connect:  (sender name:   'gameBoard')
    QObject::connect:  (receiver name: 'MainWindow')
    QObject::connect: No such signal TicTacToeWidget::gameOver(TicTacToeWidget::Player) in ../tictactoe/mainwindow.cpp:20
    QObject::connect:  (sender name:   'gameBoard')
    QObject::connect:  (receiver name: 'MainWindow')
    

    But i have both functions in the 'signals' part in the class declaration of TicTacToeWidget.
    What else could be caused this errors?

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      hi and welcome
      One common error is that moc.exe was not run so it dont know it has the signals.
      Or forgetting the Q_OBJECT macro in the class .h

      So check if u have Q_OBJECT
      do clean all
      run qmake
      rebuild

      if it still says it, please post some code :)

      1 Reply Last reply
      0
      • N Offline
        N Offline
        nischu
        wrote on last edited by
        #3

        Q_OBJECT is set, and the build process was without warnings.

        The perfidious is, that i have all source files belonging to the tutorial so i was being able to compare these to my own try. But although I compared every piece of code, I didn't found a semantic distinction.
        Only the *.ui files I couldn't check, that would too wearisome for me.

        Here the code for the connect statements:

        MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent), ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
        
            connect( ui->actionNewGame, SIGNAL(triggered()),
                     this, SLOT(startNewGame()));
        
            connect( ui->actionQuit, SIGNAL(triggered()),
                     qApp, SLOT(quit()));
        
            connect( ui->gameBoard, SIGNAL(currentPlayerChanged(TicTacToeWidget::Player))
                     , this, SLOT(updateNameLabels()));
        
            connect( ui->gameBoard, SIGNAL(gameOver(TicTacToeWidget::Player))
                     , this, SLOT(handleGameOver(TicTacToeWidget::Player)));
        }
        

        The first two connections will created fine.

        I suppose i made a mistake within Designer Mode, but i have no clue where.
        Could it be that I made a mistake at naming the sender's source? But i don't see such thing, in the Designer Mode's Object Inspector.

        1 Reply Last reply
        0
        • mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @nischu said:
          hi the UI is just translated into code. ( the setUI function)
          so i doubt it has anything to do with it.

          also since you use directly connect, you are in control.

          one thing i do wonder

          connect( ui->gameBoard, SIGNAL(currentPlayerChanged(TicTacToeWidget::Player))
          , this, SLOT(updateNameLabels()));

          should that not be
          connect( ui->gameBoard, SIGNAL(currentPlayerChanged(TicTacToeWidget::Player))
          , this, SLOT(updateNameLabels(TicTacToeWidget::Player)));

          anyway, you can check what connect returns to see if it fails

          qDebug() << "con1:" << connect(xxx

          it says TRUE when it accepts the connect.

          1 Reply Last reply
          0
          • N Offline
            N Offline
            nischu
            wrote on last edited by
            #5

            @mrjj said:
            should that not be
            connect( ui->gameBoard, SIGNAL(currentPlayerChanged(TicTacToeWidget::Player))
            , this, SLOT(updateNameLabels(TicTacToeWidget::Player)));

            No, it's ok. Here the handling:

            void MainWindow::updateNameLabels()
            {
                QFont f = ui->player1->font();
                f.setBold( ui->gameBoard->currentPlayer() == TicTacToeWidget::Player1);
                ui->player1->setFont(f);
                f.setBold( ui->gameBoard->currentPlayer() == TicTacToeWidget::Player2);
                ui->player2->setFont(f);
            }
            

            Thanks for your hint with QDebug. But that says no news: con1,con2 == true, con3,con4 == false

            1 Reply Last reply
            0
            • mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by mrjj
              #6

              Hi if you can zip the whole project, i could have a look?
              or link to the tut.
              or show the .h and .cpp where signals/slots are defined

              1 Reply Last reply
              0
              • N Offline
                N Offline
                nischu
                wrote on last edited by
                #7

                mrjj, Thanks for taking your time looking over my source code.
                [Here are my own files]

                [And here the files published by my book] This compiles and runs without errors.

                jerome_isAviableJ mrjjM 2 Replies Last reply
                0
                • N nischu

                  mrjj, Thanks for taking your time looking over my source code.
                  [Here are my own files]

                  [And here the files published by my book] This compiles and runs without errors.

                  jerome_isAviableJ Offline
                  jerome_isAviableJ Offline
                  jerome_isAviable
                  wrote on last edited by
                  #8

                  Hi @nischu,
                  when you connect signal and slot the sign has to be exactly the same.
                  If you have a signal signed: currentPlayerChanged(TicTacToeWidget::Player)
                  you need to link with a slot signed: compatibleSlotToBeLinked(TicTacToeWidget::Player)

                  if not, the link not occur as specified in the doc (just before "Advanced Signals and Slots Usage" not far from the end of the article doc.

                  http://doc.qt.io/qt-5/signalsandslots.html

                  1 Reply Last reply
                  2
                  • N nischu

                    mrjj, Thanks for taking your time looking over my source code.
                    [Here are my own files]

                    [And here the files published by my book] This compiles and runs without errors.

                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    @nischu

                    hi as @jerome_isAviable says

                    it was the name space/scope naming that confused it.
                    "player" vs "TicTacToeWidget::player"

                    void currentPlayerChanged( Player);
                    works if
                    void currentPlayerChanged( TicTacToeWidget::Player );

                    here is fixed and running sample
                    https://www.dropbox.com/s/jvsoulsvmh3292g/tictactoe.zip?dl=0

                    1 Reply Last reply
                    3
                    • VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #10

                      Despite almost all the documentation still using SIGNAL() and SLOT(), you should really switch to the Qt5 syntax https://wiki.qt.io/New_Signal_Slot_Syntax it catches these problems at compile time and makes it easier to solve them

                      "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

                      mrjjM 1 Reply Last reply
                      2
                      • VRoninV VRonin

                        Despite almost all the documentation still using SIGNAL() and SLOT(), you should really switch to the Qt5 syntax https://wiki.qt.io/New_Signal_Slot_Syntax it catches these problems at compile time and makes it easier to solve them

                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by mrjj
                        #11

                        @VRonin
                        I complete agree that the new syntax has much better checks etc
                        but sadly its very unfriendly to
                        beginners when overloaded signals are used.

                        connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
                        vs
                        connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));

                        Its sad that compile time check has such a high price in syntax complexity and
                        pretty ugly to look at :) ( IMO)

                        update:
                        just seen that Qt 5.7 has qOverload
                        so my point is not so valid :)

                        1 Reply Last reply
                        0
                        • N Offline
                          N Offline
                          nischu
                          wrote on last edited by
                          #12

                          Thank you all for helping detect ths error. I will take a close look at the related docs.
                          Regards, Nico

                          1 Reply Last reply
                          1

                          • Login

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