KL
Konstantin LazarevJan. 26, 2017, 8:17 a.m.

Проблемы смены картинки

QNetworkAccessManager, Image, QLabel

Добрый день. В приложении использую класс QNetworkAccessManager для загрузки изображений с сайта. Загружается порядком 10 изображений. Загружаются они в QLabel. Отрабатывает все отлично. После того, как сворачиваю приложение или нажимаю кнопку alt., все изображения меняются на одну из картинок. В проекте не прописана работа с клавиатурой вообще. Что это может быть?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

16
KL
  • Jan. 26, 2017, 8:19 a.m.

Дополню, смена картинки наблюдается только раз, при повторном нажатии на alt ничего не происходит

    KL
    • Jan. 26, 2017, 9:04 a.m.

    Класс работающий с сетью

      KL
      • Jan. 26, 2017, 9:05 a.m.

      Заголовочный файл

        KL
        • Jan. 26, 2017, 9:05 a.m.

        Интерфейс

          KL
          • Jan. 26, 2017, 9:05 a.m.

          Интерфейс

            KL
            • Jan. 26, 2017, 9:07 a.m.
            #include "network_my.h"
            #include <QNetworkAccessManager>
            #include <QNetworkReply>
            #include "googlequery.h"
            #include <QDebug>
            #include "makesaytslist.h"
            #include <QWebFrame>
            #include <QWebPage>
            Network_my::Network_my(QObject *parent):QObject(parent)
            {
            
            
                 connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(on_Result(QNetworkReply*)));
                  connect(&managerImage,SIGNAL(finished(QNetworkReply*)),SLOT(Download_Image(QNetworkReply*)));
            }
            
            void Network_my::setData(QString Region, QString Query)
            {
            Google_Region=Region;
            Query_User=Query;
            Download();
            }
            
            QStringList Network_my::getListSayts()
            {
                return Sayt_List;
            }
            
            void Network_my::setTic_Sayt_Image(QString NameSayt)
            {
            
                urlGoogle.clear();
                urlGoogle.setUrl("http://www.yandex.ru/cycounter?"+NameSayt+"");
                request.setUrl(urlGoogle);
                managerImage.get(request);
            }
            
            QPixmap Network_my::getImage()
            {
                return pixmap;
            }
            
            void Network_my::on_Result(QNetworkReply *reply)
            {
                if(reply->error()){
                        // Сообщаем об этом и показываем информацию об ошибках
                        qDebug() << "ERROR";
                        qDebug() << reply->errorString();
                    } else {
                        Main_String=QString::fromUtf8(reply->readAll());
            
                        Sayt_List=Make.SaytsList(Main_String);
                        emit onReady();
                        }
                reply->deleteLater();
            }
            
            void Network_my::Download()
            {
                urlGoogle.clear();
                 urlGoogle.setUrl( Make.MakeGoogleQuery(Google_Region, Query_User));
                  requestQuery.setUrl(urlGoogle);
                 manager.get(requestQuery);
            
            }
            
            void Network_my::Download_Image(QNetworkReply*reply)
            {
                pixmap.loadFromData(reply->readAll());
                emit ImageDownload();
                reply->deleteLater();
            }
            
            
            
            
              KL
              • Jan. 26, 2017, 9:08 a.m.
              #ifndef NETWORK_MY_H
              #define NETWORK_MY_H
              #include <QObject>
              #include <QNetworkReply>
              #include <makesaytslist.h>
              #include <QPixmap>
              #include <QWebPage>
              class Network_my:public QObject
              {
                  Q_OBJECT
              private:
                  QString Main_String;// В строке будет содержаться XML документ
                  QString Google_Region;
                  QString Query_User;
                  QStringList Sayt_List;
                  MakeSaytsList Make; // Класс по работе с XML документом
                  QUrl urlGoogle;
                  QNetworkAccessManager manager, managerImage;
                  QNetworkRequest requestQuery, request;
                  QPixmap pixmap;
              
              public:
                 explicit Network_my(QObject *parent=0);
                  void setData(QString Region, QString Query);  // Метод инициализации запроса на получение данных
                  QStringList getListSayts();
                   void setTic_Sayt_Image(QString NameSayt);
                  QPixmap getImage();
              private slots:
                   void on_Result(QNetworkReply *reply);
                    void Download_Image(QNetworkReply *reply);
              
              
              protected:
                   void Download();
                  signals:
                   void onReady();
                   void ImageDownload();
              };
              
              #endif // NETWORK_MY_H
              
              
                KL
                • Jan. 26, 2017, 9:08 a.m.
                #ifndef GOOGLEQUERY_H
                #define GOOGLEQUERY_H
                
                #include <QWidget>
                #include <QWebPage>
                #include <QNetworkAccessManager>
                #include "network_my.h"
                namespace Ui {
                class GoogleQuery;
                }
                
                class GoogleQuery : public QWidget
                {
                    Q_OBJECT
                
                public:
                    explicit GoogleQuery(QWidget *parent = 0);
                    ~GoogleQuery();
                private slots:
                    void on_pushButton_2_clicked();
                    void on_pushButton_clicked();
                    void readHtmlGoogle();
                    void WriteYandexTic();
                    void Set_Tic_Image(); //Показывает картинки с Тицом
                private:
                    Ui::GoogleQuery *ui;
                     QWebPage pageGoogle;
                     QNetworkAccessManager pageYandexTic;
                     Network_my Network;
                     QStringList ListSayt;
                
                };
                
                #endif // GOOGLEQUERY_H
                
                
                  KL
                  • Jan. 26, 2017, 9:09 a.m.
                  #include "googlequery.h"
                  #include "ui_googlequery.h"
                  #include <QDebug>
                  #include <QUrl>
                  #include <QWebPage>
                  #include <QWebFrame>
                  #include <QStringList>
                  #include <QNetworkAccessManager>
                  #include <QNetworkReply>
                  #include "makesaytslist.h"
                  int counter=0;
                   MakeSaytsList Make;
                  GoogleQuery::GoogleQuery(QWidget *parent) :
                      QWidget(parent),
                      ui(new Ui::GoogleQuery)
                  {
                      ui->setupUi(this);
                      ui->comboBox->addItem("google.ru");
                      ui->comboBox->addItem("google.com.ua");
                      ui->lineEdit->setText("gazetax.ru");
                      ui->lineEdit_2->setText("платные комментарии");
                      connect(&Network,SIGNAL(onReady()),this,SLOT(readHtmlGoogle()));
                      connect(&Network,SIGNAL(ImageDownload()),this,SLOT(WriteYandexTic()));
                     // connect(&Network,SIGNAL(imageDownload()),this,SLOT(WriteYandexTic()));
                      counter=0;
                  }
                  
                  GoogleQuery::~GoogleQuery()
                  {
                      delete ui;
                  }
                  
                  void GoogleQuery::on_pushButton_2_clicked()
                  {
                      close();
                  }
                  
                  
                  void GoogleQuery::on_pushButton_clicked()
                  {
                  
                      if(ui->lineEdit->text()!="" and ui->lineEdit_2->text()!="")
                      {
                          Network.setData(ui->comboBox->currentText(), ui->lineEdit_2->text()); //Начало работы класса Network.
                          ui->label_10->clear();
                      }
                      else
                      {
                          ui->label_10->setText("Введите название сайта или запрос");
                      }
                  }
                  void GoogleQuery::readHtmlGoogle()
                  {
                      ListSayt.clear();
                      ui->plainTextEdit->clear();   // очистка поля
                      ListSayt=Network.getListSayts();    // Возвращает список сайтов из выдачи Google
                      for(int i=0; i<10; i++)
                      {
                         QString number;
                         number=QString::number(1+i);
                          ui->plainTextEdit->appendPlainText(number+" "+ListSayt[i]);
                      }
                      int counter_2=0;
                      for(int i=0; i<ListSayt.size(); i++)  // Определяет позицию искомого сайта
                      {
                          if(ListSayt[i]==ui->lineEdit->text())
                          {
                               counter_2++;
                             ui->lcdNumber->display(++i);
                             break;
                          }
                      }
                      if(counter_2==0)
                      {
                          ui->lcdNumber->display(0);
                      }
                     Set_Tic_Image();
                  }
                  /*
                  void GoogleQuery::loadProgressGoogle(int value)
                  {
                      ui->progressBar->setValue(value);
                  }
                  */
                  
                  void GoogleQuery::WriteYandexTic()
                  {
                      switch (counter) {
                      case 0:
                          ui->label_4->setPixmap(Network.getImage());
                          counter++;
                          Set_Tic_Image();
                          break;
                      case 1:
                          ui->label_5->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 2:
                          ui->label_6->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 3:
                          ui->label_7->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 4:
                          ui->label_8->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 5:
                          ui->label_9->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 6:
                          ui->label_12->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 7:
                          ui->label_13->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 8:
                          ui->label_14->setPixmap(Network.getImage());
                          counter++;
                           Set_Tic_Image();
                          break;
                      case 9:
                          ui->label_15->setPixmap(Network.getImage());
                          counter=0;
                          break;
                      }
                  }
                  
                  void GoogleQuery::Set_Tic_Image()
                  {
                      Network.setTic_Sayt_Image(ListSayt[counter]);
                  }
                  
                  
                  
                    Evgenii Legotckoi
                    • Jan. 26, 2017, 9:30 a.m.
                    • The answer was marked as a solution.

                    Не совсем пока ясно, почему может происходить обновление. Но выставляется одна картинка потому, что Network.getImage() возвращает последнюю картинку, которую Вы скачали. Я так понимаю, как раз последняя картинка и выставляется везде при этом случайном обновлении.

                    Поэтому рекомендую вместо хранения информации с последней картинкой в QPixmap , хранить информацию обо всех картинках, которые вы запросили за один запрос. Для этого можно использовать QVector

                    QVector<QPixmap> pixmaps;
                    

                    Ну и модифицировать метод getImage() , что-нибудь вроде такого:

                    QPixmap Network_my::getImage(int indexPixmap)
                    {
                        return pixmaps.at(indexPixmap);
                    }
                    

                    Тогда это позволит убрать для начала симптомы проблемы.

                    А вот причина проблемы в неконтролируемом срабатывании слота WriteYandexTic . Не очень ясно, почему он так срабатывает. Попробуйте пройтись дебагером, код небольшой, так что вполне реально отыскать проблему.

                      KL
                      • Jan. 26, 2017, 9:43 a.m.

                      Спасибо вам, попробую реализовать через QVector. Но очень странно себя ведет приложение, раньше не сталкивался с таким. А по поводу использования двух менеджеров, допустимо?

                        Evgenii Legotckoi
                        • Jan. 26, 2017, 9:52 a.m.

                        Два менеджера на данный момент пойдёт. У вас в коде другая проблема. Вот этот switch case с лейблами - это очень слабый архитектурный ход. Лучше, чтобы QLabel добавлялись и удалялись динамически.

                        Также стоит переписать метод Set_Tic_Image() . Так будет правильнее.

                        void GoogleQuery::Set_Tic_Image(int index)
                        {
                            Network.setTic_Sayt_Image(ListSayt[index]);
                        }
                        

                        Если сделать динамические лейблы и переписать Set_Tic_Image , то можно будет избавиться от switch case .

                        И ещё проблема с кодстайлом: GoogleQuery::Set_Tic_Image() . Вы уже определитесь с названием метода или нижние подчёркивания или Camel Style. То есть или так GoogleQuery::setTicImage() , или так GoogleQuery::set_tic_image() .

                          KL
                          • Jan. 26, 2017, 9:56 a.m.

                          Спасибо, буду исправлять.

                            KL
                            • Jan. 26, 2017, 10:50 a.m.

                            Через вектора все получилось, спасибо за помощь и совет!!!

                              KL
                              • Jan. 26, 2017, 11 a.m.

                              Я лейблы проставлял через дизайнер. Вы советуете прописать их через код используя setGeometry()?

                                Evgenii Legotckoi
                                • Jan. 26, 2017, 11:03 a.m.

                                Не совсем. Посмотрите вот этот урок по динамическому созданию виджетов , думаю идея тогда будет понятна.

                                  Comments

                                  Only authorized users can post comments.
                                  Please, Log in or Sign up
                                  Lz

                                  C ++ - Test 004. Pointers, Arrays and Loops

                                  • Result:70points,
                                  • Rating points1
                                  РК

                                  Qt - Test 001. Signals and slots

                                  • Result:84points,
                                  • Rating points4
                                  Last comments
                                  k
                                  kmssrFeb. 9, 2024, 5:43 a.m.
                                  Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  EVA
                                  EVADec. 25, 2023, 9:30 p.m.
                                  Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                  J
                                  JonnyJoDec. 25, 2023, 7:38 p.m.
                                  Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                  G
                                  GvozdikDec. 19, 2023, 8:01 a.m.
                                  Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                  Now discuss on the forum
                                  BlinCT
                                  BlinCTJune 25, 2024, 11 a.m.
                                  Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  BlinCT
                                  BlinCTMay 5, 2024, 3:46 p.m.
                                  Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiMay 3, 2024, 12:07 a.m.
                                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
                                  IscanderChe
                                  IscanderCheApril 30, 2024, 2:22 p.m.
                                  Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

                                  Follow us in social networks