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. Need help with signals and slots

Need help with signals and slots

Scheduled Pinned Locked Moved Solved General and Desktop
4 Posts 3 Posters 214 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.
  • K Offline
    K Offline
    Katha99
    wrote on last edited by
    #1

    Hello everyone,

    I am a bit lost and confused here and would be very thankful if someone could help me.

    I want to call a function after a button is clicked. My program doesn't give me any errors and the Signal and the Slot is connected (I put a bool variable in front of the connect and checked its value. It was true. ), but the function undoOneMove3 won't execute (I don't get the text I put in the function. And I'm pretty sure the output commands are not the problem, because I tried them somewhere else in the program where they worked.)
    But I don't find the reason it doesn't work.

    Here are parts of the programm:

    undomove.hpp

    #ifndef UNDOMOVE_H
    #define UNDOMOVE_H
    
    #include <stack>
    #include <QLabel>
    #include "dragwidget.h"
    
    class undoMove3 : public Drag3Widget
    {
        Q_OBJECT
    public:
        explicit undoMove3(QWidget *parent = nullptr);
    
    private:
        static std::stack<Drag3Widget*> undoStack3;     
        static std::stack< int > undoCoord3x;          
        static std::stack< int > undoCoord3y;
    
        friend class Drag3Widget;
    
    public slots:
        void undoOneMove3();
    
    };
    
    #endif // UNDOMOVE_H
    

    undomove.cpp

    #include "undomove.h"
    #include <QTextStream>
    
    undoMove3::undoMove3( QWidget *parent ){ }
    
    // löscht den letzten Spielstein vom Spielfeld und legt ihn auf die Benutzerhand.
    void undoMove3::undoOneMove3(){
    
        if ( undoMove3::undoStack3.empty() )
        {
            QTextStream out(stdout);
            out << QString("undoOneMove3-Function-Beginning");
    
            QLabel *newIcon = new QLabel( undoMove3::undoStack3.top() );
    
            int Coord1 = undoMove3::undoCoord3x.top();
            int Coord2 = undoMove3::undoCoord3y.top();
            newIcon->setGeometry( Coord1, Coord2, 75, 75 );
    
            undoMove3::undoStack3.pop();
            undoMove3::undoCoord3x.pop();
            undoMove3::undoCoord3y.pop();
    
            newIcon->show();
            newIcon->setAttribute(Qt::WA_DeleteOnClose);
    
            out << QString("undoOneMove3-Function-End");
        }
        return;
    }
    
    std::stack<Drag3Widget*> undoMove3::undoStack3;
    std::stack< int > undoMove3::undoCoord3x;
    std::stack< int > undoMove3::undoCoord3y;
    

    main.cpp

    #include "mainwindow.h"
    #include "dragwidget.h"
    #include "undomove.h"
    
    #include <QApplication>
    #include <QLabel>
    #include <QPushButton>
    #include <QLayout>
    #include <QFrame>
    #include <QHBoxLayout>
    #include <QDrag>
    #include <QMimeData>
    #include <QMouseEvent>
    #include <QToolButton>
    #include <QTextEdit>
    #include <QObject>
    #include <QTextStream>
    
    #include <QGlobal.h>
    #include <QTime>
    
     int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QWidget* hauptfenster = new QWidget();
        hauptfenster->setGeometry(80,60,1600,900); 
    
    ....
    
        QPushButton* undo = new QPushButton (hauptfenster);
        undo-> setGeometry(1270,670,80,80);
        undo-> setIcon(QPixmap(":/images/retry.png"));
        undo-> setIconSize(QSize(80,80));
    
        undoMove3 undoMoveObject;
        QObject::connect(undo, &QPushButton::clicked, &undoMoveObject, 
        &undoMove3::undoOneMove3 );
    
    ...
    
    hauptfenster->show();
    
        return a.exec();
    
    sierdzioS 1 Reply Last reply
    0
    • K Katha99

      Hello everyone,

      I am a bit lost and confused here and would be very thankful if someone could help me.

      I want to call a function after a button is clicked. My program doesn't give me any errors and the Signal and the Slot is connected (I put a bool variable in front of the connect and checked its value. It was true. ), but the function undoOneMove3 won't execute (I don't get the text I put in the function. And I'm pretty sure the output commands are not the problem, because I tried them somewhere else in the program where they worked.)
      But I don't find the reason it doesn't work.

      Here are parts of the programm:

      undomove.hpp

      #ifndef UNDOMOVE_H
      #define UNDOMOVE_H
      
      #include <stack>
      #include <QLabel>
      #include "dragwidget.h"
      
      class undoMove3 : public Drag3Widget
      {
          Q_OBJECT
      public:
          explicit undoMove3(QWidget *parent = nullptr);
      
      private:
          static std::stack<Drag3Widget*> undoStack3;     
          static std::stack< int > undoCoord3x;          
          static std::stack< int > undoCoord3y;
      
          friend class Drag3Widget;
      
      public slots:
          void undoOneMove3();
      
      };
      
      #endif // UNDOMOVE_H
      

      undomove.cpp

      #include "undomove.h"
      #include <QTextStream>
      
      undoMove3::undoMove3( QWidget *parent ){ }
      
      // löscht den letzten Spielstein vom Spielfeld und legt ihn auf die Benutzerhand.
      void undoMove3::undoOneMove3(){
      
          if ( undoMove3::undoStack3.empty() )
          {
              QTextStream out(stdout);
              out << QString("undoOneMove3-Function-Beginning");
      
              QLabel *newIcon = new QLabel( undoMove3::undoStack3.top() );
      
              int Coord1 = undoMove3::undoCoord3x.top();
              int Coord2 = undoMove3::undoCoord3y.top();
              newIcon->setGeometry( Coord1, Coord2, 75, 75 );
      
              undoMove3::undoStack3.pop();
              undoMove3::undoCoord3x.pop();
              undoMove3::undoCoord3y.pop();
      
              newIcon->show();
              newIcon->setAttribute(Qt::WA_DeleteOnClose);
      
              out << QString("undoOneMove3-Function-End");
          }
          return;
      }
      
      std::stack<Drag3Widget*> undoMove3::undoStack3;
      std::stack< int > undoMove3::undoCoord3x;
      std::stack< int > undoMove3::undoCoord3y;
      

      main.cpp

      #include "mainwindow.h"
      #include "dragwidget.h"
      #include "undomove.h"
      
      #include <QApplication>
      #include <QLabel>
      #include <QPushButton>
      #include <QLayout>
      #include <QFrame>
      #include <QHBoxLayout>
      #include <QDrag>
      #include <QMimeData>
      #include <QMouseEvent>
      #include <QToolButton>
      #include <QTextEdit>
      #include <QObject>
      #include <QTextStream>
      
      #include <QGlobal.h>
      #include <QTime>
      
       int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      
          QWidget* hauptfenster = new QWidget();
          hauptfenster->setGeometry(80,60,1600,900); 
      
      ....
      
          QPushButton* undo = new QPushButton (hauptfenster);
          undo-> setGeometry(1270,670,80,80);
          undo-> setIcon(QPixmap(":/images/retry.png"));
          undo-> setIconSize(QSize(80,80));
      
          undoMove3 undoMoveObject;
          QObject::connect(undo, &QPushButton::clicked, &undoMoveObject, 
          &undoMove3::undoOneMove3 );
      
      ...
      
      hauptfenster->show();
      
          return a.exec();
      
      sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by sierdzio
      #2

      @Katha99 said in Need help with signals and slots:

      if ( undoMove3::undoStack3.empty() )

      Are you sure the stack is empty? If not, your whole code won't be executed.

      out << QString("undoOneMove3-Function-Beginning");
      

      There is no need to wrap literals in QString() like this. Standard way of printing is to use qDebug() instead of text stream (but your solution should work).

      (Z(:^

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

        I don't get the text I put in the function.

        99.9% chance it's just because undoMove3::undoStack3.empty() returns false. Use a debugger and put a breakpoint before the if is checked.

        P.S.
        Looks like you are using widgets to do stuff that should be done using the graphics view framework. Might be worth having a stab at redesigning the program from the ground up

        "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

        1 Reply Last reply
        3
        • sierdzioS sierdzio

          @Katha99 said in Need help with signals and slots:

          if ( undoMove3::undoStack3.empty() )

          Are you sure the stack is empty? If not, your whole code won't be executed.

          out << QString("undoOneMove3-Function-Beginning");
          

          There is no need to wrap literals in QString() like this. Standard way of printing is to use qDebug() instead of text stream (but your solution should work).

          K Offline
          K Offline
          Katha99
          wrote on last edited by Katha99
          #4

          @sierdzio, @VRonin
          Thank you very much.
          I dont know why I put that if clause there in the beginning anymore. But actually it doesn't make any sense.... I didn't even look at the if clause while looking for the error...

          I tried the code without the if clause and it worked.
          Thank you very much for your help.

          I will try using qDebug() next time and I will take a look at the Qt Graphics Framework. I don't know it, to be honest.

          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