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
                                  AD

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

                                  • Result:50points,
                                  • Rating points-4
                                  m

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

                                  • Result:80points,
                                  • Rating points4
                                  m

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

                                  • Result:20points,
                                  • Rating points-10
                                  Last comments
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                  A
                                  ALO1ZEOct. 19, 2024, 8:19 a.m.
                                  Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas5July 5, 2024, 11:02 a.m.
                                  QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  k
                                  kmssrFeb. 8, 2024, 6:43 p.m.
                                  Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  Now discuss on the forum
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  t
                                  tonypeachey1Nov. 15, 2024, 6:04 a.m.
                                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                  NSProject
                                  NSProjectJune 4, 2022, 3:49 a.m.
                                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                  9
                                  9AnonimOct. 25, 2024, 9:10 a.m.
                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                  Follow us in social networks