KL
Konstantin Lazarev26 января 2017 г. 8:17

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

QNetworkAccessManager, Image, QLabel

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

16
KL
  • 26 января 2017 г. 8:19

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

    KL
    • 26 января 2017 г. 9:04

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

      KL
      • 26 января 2017 г. 9:05

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

        KL
        • 26 января 2017 г. 9:05

        Интерфейс

          KL
          • 26 января 2017 г. 9:05

          Интерфейс

            KL
            • 26 января 2017 г. 9:07
            #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
              • 26 января 2017 г. 9:08
              #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
                • 26 января 2017 г. 9:08
                #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
                  • 26 января 2017 г. 9:09
                  #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
                    • 26 января 2017 г. 9:30
                    • Ответ был помечен как решение.

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

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

                    QVector<QPixmap> pixmaps;
                    

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

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

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

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

                      KL
                      • 26 января 2017 г. 9:43

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

                        Evgenii Legotckoi
                        • 26 января 2017 г. 9:52

                        Два менеджера на данный момент пойдёт. У вас в коде другая проблема. Вот этот 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
                          • 26 января 2017 г. 9:56

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

                            KL
                            • 26 января 2017 г. 10:50

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

                              KL
                              • 26 января 2017 г. 11:00

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

                                Evgenii Legotckoi
                                • 26 января 2017 г. 11:03

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

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  AD

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:50баллов,
                                  • Очки рейтинга-4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 8:37

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:80баллов,
                                  • Очки рейтинга4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 8:29

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:20баллов,
                                  • Очки рейтинга-10
                                  Последние комментарии
                                  i
                                  innorwall12 ноября 2024 г. 5:12
                                  Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                                  i
                                  innorwall12 ноября 2024 г. 1:23
                                  QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                                  i
                                  innorwall11 ноября 2024 г. 22:50
                                  Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                                  i
                                  innorwall11 ноября 2024 г. 21:19
                                  Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                                  i
                                  innorwall11 ноября 2024 г. 20:55
                                  PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                                  Сейчас обсуждают на форуме
                                  i
                                  innorwall12 ноября 2024 г. 3:56
                                  добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                                  i
                                  innorwall11 ноября 2024 г. 17:55
                                  Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                  9
                                  9Anonim25 октября 2024 г. 16:10
                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                  ИМ
                                  Игорь Максимов3 октября 2024 г. 11:05
                                  Реализация навигации по разделам Спасибо Евгений!

                                  Следите за нами в социальных сетях