Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. Invalid use of ‘this’ in non-member function
Forum Updated to NodeBB v4.3 + New Features

Invalid use of ‘this’ in non-member function

Scheduled Pinned Locked Moved C++ Gurus
9 Posts 3 Posters 11.2k 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.
  • Y Offline
    Y Offline
    yaboinav
    wrote on last edited by
    #1

    I keep getting ^^ error message. This is the code:

    test.cpp:
    @
    QPushButton* saveButton = new QPushButton("Save");
    QObject::connect(saveButton,SIGNAL(clicked()), this, SLOT(Save()));
    QObject::connect(saveButton,SIGNAL(clicked()), summary, SLOT(clear()));
    @

    test.hpp
    @
    #ifndef TEST_HPP
    #define TEST_HPP

    #include <QWidget>

    class QPushButton;
    class QComboBox;
    class QDateTimeEdit;
    class QTextEdit;
    class QLabel;

    class Press: public QWidget
    {
    Q_OBJECT

    public:
    Press(QWidget* parent = 0);

    public slots:
    void Save();
    void Discard();

    private:
    QLabel* startLabel;
    QLabel* finishLabel;
    QLabel* locationLabel;
    QLabel* summaryLabel;
    QPushButton* saveButton;
    QPushButton* discardButton;
    QComboBox * location;
    QTextEdit * summary;
    QDateTimeEdit* startDate;
    QDateTimeEdit* finishDate;
    };
    #endif
    @

    [edit: corrected use of coding tags SGaist]

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

      Hi and welcome to devnet,

      @
      test.cpp:
      QPushButton* saveButton = new QPushButton("Save");
      QObject::connect(saveButton,SIGNAL(clicked()), this, SLOT(Save()));
      QObject::connect(saveButton,SIGNAL(clicked()), summary, SLOT(clear()));
      @

      This is wrong, you can't just throw code in the cpp file. You have to implement the constructors/functions of your class.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • Y Offline
        Y Offline
        yaboinav
        wrote on last edited by
        #3

        can you give me an example please?

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

          Qt's documentation is full of "examples and tutorials":http://qt-project.org/doc/qt-5/qtexamplesandtutorials.html

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • Y Offline
            Y Offline
            yaboinav
            wrote on last edited by
            #5

            @
            #include "test.hpp"
            #include <QApplication>
            #include <QLabel>
            #include <QWidget>
            #include <QDateTimeEdit>
            #include <QComboBox>
            #include <QPushButton>
            #include <QVBoxLayout>
            #include <QHBoxLayout>
            #include <QTextEdit>

            int main(int argc, char* argv[])
            {
            QApplication app(argc, argv);

            QDateTimeEdit* startDate= new QDateTimeEdit();
            QDateTimeEdit* finishDate = new QDateTimeEdit();
            QTextEdit * summary = new QTextEdit();
            
            //QWidget* window = new QWidget;
            QLabel* startLabel = new QLabel("Start");
            QLabel* finishLabel = new QLabel("Finish:");
            QLabel* locationLabel = new QLabel("Location:");
            QLabel* summaryLabel = new QLabel("Summary:");
            
            QPushButton* saveButton = new QPushButton("Save");
            QObject::connect(saveButton,SIGNAL(clicked()), this,  SLOT(Save()));    
            QObject::connect(saveButton,SIGNAL(clicked()), summary, SLOT(clear()));
            
            
            
            QPushButton* discardButton = new QPushButton("Discard");
            QObject::connect(discardButton,SIGNAL(clicked()), summary, SLOT(clear()));
            QObject::connect(discardButton,SIGNAL(clicked()), this, SLOT(discard()));
            
            
            
            
            
            startDate->setDateTime( QDateTime::currentDateTime() );
            finishDate->setDateTime( QDateTime::currentDateTime() );
            finishDate->setDateTime(startDate->dateTime().addSecs( 3600 ));
            
            
            
            QStringList locationList;
            locationList << "Enaic" << "Dec10" << "Active";
            QComboBox * location = new QComboBox();
            location->addItems(locationList);
            
            //Set Buddies
            startLabel->setBuddy(startDate);
            finishLabel->setBuddy(finishDate);
            summaryLabel->setBuddy(summary);
            locationLabel->setBuddy(location);
            
            
            QGridLayout * upperlayout = new QGridLayout;
            upperlayout->addWidget(startLabel, 0, 0);
            upperlayout->addWidget(startDate, 0, 1);
            upperlayout->addWidget(finishLabel, 1, 0);
            upperlayout->addWidget(finishDate, 1, 1);
            upperlayout->addWidget(locationLabel, 2, 0);
            upperlayout->addWidget(location, 2, 1);
            
            
            
            
            
            QVBoxLayout * middleLayout = new QVBoxLayout();
            middleLayout->addWidget(summaryLabel);
            middleLayout->addWidget(summary);
            
            QHBoxLayout * bottomLayout = new QHBoxLayout();
            bottomLayout->addWidget(saveButton);
            bottomLayout->addWidget(discardButton);
            
            
            QVBoxLayout * mainLayout = new QVBoxLayout();
            mainLayout->addLayout(upperlayout);
            mainLayout->addLayout(middleLayout);   
            mainLayout->addLayout(bottomLayout);
             
            void Press::Save(){
                QString filename="test.txt";
                QFile file&#40;filename&#41;;
                if (file.open(QIODevice::WriteOnly))
                {
                    QTextStream stream(&file);
                    QString startboxstring = startbox->dateTime().toString("dd.MM.yyyy hh.mm");
                    QString finishboxstring = finishbox->dateTime().toString("dd.MM.yyyy hh.mm");
                    QString locationboxstring = locationbox->currenttext();
                    QString summaryboxstring = summarybox->toPlainText();
                    stream << startboxstring.toAscii()<<"/n"<< finishboxstring.toAscii()<<"/n"<<locationboxstring.toAscii()<<"/n"<<summaryboxstring.toAscii();
                }  
                locationbox->setCurrentIndex(0);
                startbox->setDateTime(QDateTime::currentDateTime());
                finishbox->setDateTime(QDateTime::currentDateTime().addSecs(3600));  
            }
            
            void Press:Discard()
            {   
                locationbox->setCurrentIndex(0);
                startbox->setDateTime(QDateTime::currentDateTime());
                finishbox->setDateTime(QDateTime::currentDateTime().addSecs(3600));
            
            }   
            
            
            window->setLayout(mainLayout);
            

            }
            @

            If you look at the discardbutton part, this is where the problem is! Im sure I have implemented the constructor..

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

              From the code you posted, it seems you are both a beginner in C++ and Qt.

              There's no constructor (at least in that file), you are implementing two functions from Press inside the main function and you never start the event loop.

              You should really take the time to read Qt's examples. You'll go quicker after that.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • R Offline
                R Offline
                Rolias
                wrote on last edited by
                #7

                Are you using Qt Creator? If so you should start by adding a new class. Let's call it Press, then Qt creator will create press.h and press.cpp for your. Press. h will look like this:
                @class Press : public QWidget
                {
                Q_OBJECT
                public:
                explicit Press(QWidget *parent = 0);

                signals:
                
                public slots:
                

                };
                @

                press.cpp will look like this
                @
                #include "press.h"

                Press::Press(QWidget *parent) :
                QWidget(parent)
                {
                }
                @

                When you add any private member to your .h file like

                @ QPushButton* saveButton;@

                You should initialize it in your class constructor's initializer list. That would give you a .h file that now looks like this

                @
                #include <QWidget>

                class QPushButton;

                class Press : public QWidget
                {
                Q_OBJECT
                public:
                explicit Press(QWidget *parent = 0);

                signals:
                    
                public slots:
                    
                private:
                    QPushButton* saveButton;
                

                };
                @

                and a .cpp file that looks like this:

                @
                #include "press.h"
                #include <QPushButton>

                Press::Press(QWidget *parent) :
                QWidget(parent),
                saveButton (new QPushButton("Save",this))
                {
                }
                @

                Now your saveButton pointer has a legitimate value when the class constructor runs. Of course you have to run the class constructor. So somewhere in main if you want to use the Press class you need the include and a statement that looks like this is you want a solid instance of your object.

                @
                Press myPress;
                @

                THEN when you want to use Save in a connect statement you would use a statement like this:

                @
                QObject::connect(saveButton,SIGNAL(clicked()), &myPress, SLOT(Save()));
                @

                That line assumes saveButton is a pointer. With savePointer as a solid object main would end up looking something like this

                @
                Press myPress;
                QPushButton saveButton;
                QObject::connect(&saveButton,SIGNAL(clicked()), &myPress, SLOT(Save()));
                @

                While what follows is self-promotion I REALLY think you would benefit from watching my "Introduction to Qt":http://bit.ly/introqt course on Pluralsight.
                Pluralsight is a subscription service. You have the right to a subscription service If you can't afford a subscription service one will be provided to you!

                Just send me an email through the forum and I'll give you a VIP pass good for unlimited hours (includes offline viewing) that lasts for one week. My first course is four+ hours long. You should be able to watch both it and my class on "Qt Quick":http://bit.ly/qtquickfun. It should even give you enough time to watch some of the programming classes on C++.

                Edit:Fixed memory leaks.

                Check out my third course in the trilogy on Qt
                "Integrating Qt Quick with C++"
                http://bit.ly/qtquickcpp
                published by Pluralsight

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  [quote author="Rolias" date="1415821602"]
                  main would end up looking something like this

                  @
                  Press* myPress = new Press();
                  QPushButton* saveButton = new QPushButton();
                  QObject::connect(saveButton,SIGNAL(clicked()), myPress, SLOT(Save()));
                  @
                  [/quote]

                  Watch out, there are two memory leaks here

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  0
                  • R Offline
                    R Offline
                    Rolias
                    wrote on last edited by
                    #9

                    Ooops. Sorry. Really three leaks I think. Although IMO myPress and saveButton are purely pedantic leaks since they are in main. The one inside Press is a nasty one. They are all bad form, so I updated the example. Hope, I got it right this time. Thanks for linting my code.

                    Check out my third course in the trilogy on Qt
                    "Integrating Qt Quick with C++"
                    http://bit.ly/qtquickcpp
                    published by Pluralsight

                    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