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
Forum Updated to NodeBB v4.3 + New Features

Need help with signals and slots

Scheduled Pinned Locked Moved Solved General and Desktop
4 Posts 3 Posters 224 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.
  • 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