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. Weird problem, with MainWindow class variables.
Forum Updated to NodeBB v4.3 + New Features

Weird problem, with MainWindow class variables.

Scheduled Pinned Locked Moved General and Desktop
18 Posts 4 Posters 3.3k 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.
  • R Offline
    R Offline
    Rondog
    wrote on 8 Feb 2015, 16:22 last edited by
    #9

    In your code you have this:

    @
    QApplication a(argc, argv);
    MainWindow w;
    Own own;
    ...
    @

    These exist only in main() which will run until a.exec() returns. For the classes 'w' and 'own' is there a pointer, or some other reference to these classes that you can use outside of main()?

    For this code:

    @
    MainWindow mw;
    int width, height;

        height = mw.GetImageHeight();
        width = mw.GetImageWidth();
    

    @

    GetImageHeight() and GetImageWidth() should return zero or possibly some other random value as it is another, unrelated class.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      AndreasA9
      wrote on 8 Feb 2015, 16:29 last edited by
      #10

      Sorry, i don't understand, what you are trying to say to me.

      1 Reply Last reply
      0
      • A Offline
        A Offline
        andreyc
        wrote on 8 Feb 2015, 17:20 last edited by
        #11

        In your example (below), are you trying to get width and height from MainWindow before app.exec() ?
        @
        MainWindow mw;
        int width, height;

            mw.GetImageHeight(height);
            mw.GetImageWidth(width);
        

        @

        If so then MainWindow::imageHeight and imageWidth are not initialized and you are getting whatever random numbers are there.

        1 Reply Last reply
        0
        • A Offline
          A Offline
          AndreasA9
          wrote on 8 Feb 2015, 17:35 last edited by
          #12

          No, im not trying to get them before app.exec()
          getImageHeight and getImageWidth are exectued after i press a button on my form and long proccess is done with network communication is done

          1 Reply Last reply
          0
          • A Offline
            A Offline
            AndreasA9
            wrote on 8 Feb 2015, 17:46 last edited by
            #13

            I post my full source code here

            mainwindow.h
            @
            #ifndef MAINWINDOW_H
            #define MAINWINDOW_H

            #include <QMainWindow>
            #include "networking.h"
            namespace Ui {
            class MainWindow;
            }

            class MainWindow : public QMainWindow
            {
            Q_OBJECT

            public:

            explicit MainWindow(QWidget *parent = 0);
            void GetImageHeight(int &height);
            void GetImageWidth(int &width);
            
            ~MainWindow();
            

            private slots:

            void on_pushButton_clicked();
            void on_WidthSlider_valueChanged(int value);
            void on_HeightSlider_valueChanged(int value);
            

            private:
            int imageWidth;
            int imageHeight;

            QUrl q;
            Ui::MainWindow *ui;
            

            };

            #endif // MAINWINDOW_H

            @

            networking.h

            @
            #ifndef NETWORKING_H
            #define NETWORKING_H

            #include <QtNetwork/QNetworkAccessManager>
            #include <QtNetwork/QNetworkRequest>
            #include <QMessageBox>
            #include "mainwindow.h"

            class networking : public QObject
            {
            Q_OBJECT

            public:
                networking();
            
                void on_download_triggered(QUrl url);
                bool IsNetworkAvailable();
            
            
            private:
                QNetworkAccessManager *manager = new QNetworkAccessManager(this);
                void ProcessPicture(QImage *image);
            

            private slots:
            void onNetworkReply(QNetworkReply* reply);

            };

            #endif // NETWORKING_H

            @

            mainwindow.cpp

            @#include "mainwindow.h"
            #include "ui_mainwindow.h"

            MainWindow::MainWindow(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::MainWindow)
            {

            ui->setupUi(this);
            this->setFixedSize(378, 304);
            

            }

            MainWindow::~MainWindow()
            {
            delete ui;
            }

            void MainWindow::on_pushButton_clicked()
            {

            if(ui->URLbox->text().isEmpty()) QMessageBox::information(0, "Warning", "No URL inserted!");
            
            else
            {
                networking *n = new networking();
                q = ui->URLbox->text();
                if(n->IsNetworkAvailable()) n->on_download_triggered(q);
            }
            

            }

            void MainWindow::GetImageHeight(int &height) {height = imageHeight;}

            void MainWindow::GetImageWidth(int &width) {width = imageWidth; }

            void MainWindow::on_WidthSlider_valueChanged(int value)
            {
            imageWidth = value;
            QString valueString = QString::number(value);
            ui->WidthLabel->setText(valueString);
            }

            void MainWindow::on_HeightSlider_valueChanged(int value)
            {
            imageHeight = value;
            QString valueString = QString::number(value);
            ui->HeightLabel->setText(valueString);
            }

            @

            networking.cpp

            @#include "networking.h"
            #include <QtNetwork/QNetworkReply>
            #include <QFileDialog>

            networking::networking()
            {
            connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onNetworkReply(QNetworkReply*)));
            }
            void networking::on_download_triggered(QUrl url)
            {
            manager->get(QNetworkRequest(QUrl(url)));
            }

            void networking::ProcessPicture(QImage *image)
            {
            MainWindow *mw = new MainWindow();

            int width, height;
            
            mw->GetImageHeight(height);
            mw->GetImageWidth(width);
            
            
            qDebug() << height;
            qDebug() << width;
            
            QImage newimage = image->scaled(width, height, Qt::KeepAspectRatio);
            QString path =  QFileDialog::getSaveFileName(0, tr("Save Image"), "C://", tr("Image Files (*.png *.jpg *.bmp)"));
            
            newimage.save(path);
            

            }

            void networking::onNetworkReply(QNetworkReply* reply)
            {
            if(!reply->error())
            {
            QImage *img = new QImage();
            img->loadFromData(reply->readAll());

                if(img->isNull())
                        QMessageBox::critical(0, "Error", "Inserted URL is not an image!");
            
                ProcessPicture(img);
            
            }
            else
            {
                QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
                int status = statusCode.toInt();
            
                qDebug() << status;
            
                switch(status)
                {
                    case 0:
                    {
                        QMessageBox::critical(0, "Error", "URL doesn't exist!");
                        break;
                    }
                    case 404:
                    {
                        QMessageBox::critical(0, "Error", "404 not found!");
                        break;
                    }
                }
            }
            

            }

            bool networking::IsNetworkAvailable()
            {
            QNetworkAccessManager m;
            QNetworkReply *check = m.get(QNetworkRequest(QUrl("google.com")));
            return (!check->error()) ? true : false;
            }
            @

            1 Reply Last reply
            0
            • R Offline
              R Offline
              Rondog
              wrote on 8 Feb 2015, 18:13 last edited by
              #14

              I think this is your problem:

              @
              void networking::ProcessPicture(QImage *image)
              {
              MainWindow *mw = new MainWindow();

              int width, height;
              
              mw->GetImageHeight(height);
              mw->GetImageWidth(width);
              
              qDebug() << height;
              qDebug() << width;
              

              ...
              }
              @

              The class '*mw' is unrelated to the mw class created in main(). The member imageWidth and imageHeight are not updated in this version.

              To verify this you could create a global pointer of the MainWindow class and see if this solves the problem:

              @
              MainWindow *g_mw;

              int main(int argc, char *argv[])
              {
                  QApplication a(argc, argv);
                  MainWindow w;
                  Own own;
              
                  g_mw = &mw;
              
               
                  QObject::connect(&w, SIGNAL(heightValueChanged(int)), &own, SLOT(imageHeight(int)));
                  QObject::connect(&w, SIGNAL(widthValueChanged(int)), &own, SLOT(imageWidth(int)));
               
                  w.show();
               
                  return a.exec&#40;&#41;;
              }
              

              @

              and then in your network module

              @
              #include "networking.h"
              #include <QtNetwork/QNetworkReply>
              #include <QFileDialog>

              extern MainWindow *g_mw;

              networking::networking()
              {
              ...
              }
              ...
              void networking::ProcessPicture(QImage *image)
              {
              // MainWindow *mw = new MainWindow();

              int width, height;
              
              g_mw->GetImageHeight(height);
              g_mw->GetImageWidth(width);
              
              
              qDebug() << height;
              qDebug() << width;
              

              ...
              }
              @

              Note: I wouldn't use a global variable like this. You are better to pass a pointer (maybe as part of the constructor of your Networking class?). It is just a simple way to verify this is the problem without changing too much.

              1 Reply Last reply
              0
              • A Offline
                A Offline
                andreyc
                wrote on 8 Feb 2015, 18:31 last edited by
                #15

                Rondog is right. You are creating new MainWindow object and it is not related to your main MainWindow.

                Another option to solve it would be to pass a MainWindow pointer to networking ctor and keep it there. Then in networking::ProcessPicture() use that pointer.
                networking.h

                @
                #ifndef NETWORKING_H
                #define NETWORKING_H

                class MainWindow;
                 
                class networking : public QObject
                {
                

                ...
                public:
                networking(MainWindow* mw);

                ...
                private:
                MainWindow* m_mw;

                };
                #endif // NETWORKING_H
                

                @

                networking.cpp
                @
                #include "networking.h"
                #include "MainWindow.h"
                #include <QtNetwork/QNetworkReply>
                #include <QFileDialog>

                networking::networking(MainWindow* mw) : m_mw(mw)
                {
                

                ...
                }

                void networking::ProcessPicture(QImage *image)
                {
                // MainWindow *mw = new MainWindow();

                int width, height;
                
                m_mw->GetImageHeight(height);
                m_mw->GetImageWidth(width);
                
                
                qDebug() << height;
                qDebug() << width;
                

                ...
                }
                @

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  AndreasA9
                  wrote on 8 Feb 2015, 19:34 last edited by
                  #16

                  Thanks, it worked! I didn't know, why i didn't realise fault myself. Quite logical. Thanks again!

                  1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    AndreasA9
                    wrote on 8 Feb 2015, 19:39 last edited by
                    #17

                    One last question, why i had to write class MainWindow; to my networking.h file.

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      andreyc
                      wrote on 8 Feb 2015, 20:26 last edited by
                      #18

                      It is a forward declaration. Compiler needs to know that a type exists but does not need to know the details. It works with the pointers and the references. Helps to avoid including unneeded headers.

                      1 Reply Last reply
                      0

                      18/18

                      8 Feb 2015, 20:26

                      • Login

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