KL
Konstantin LazarevҚаң. 26, 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 Т.Ж.

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

                                Evgenii Legotckoi
                                • Қаң. 26, 2017, 11:03 Т.Ж.

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

                                  Пікірлер

                                  Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                  Кіріңіз немесе Тіркеліңіз
                                  AD

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

                                  • Нәтиже:50ұпай,
                                  • Бағалау ұпайлары-4
                                  m
                                  • molni99
                                  • Қаз. 26, 2024, 1:37 Т.Ж.

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

                                  • Нәтиже:80ұпай,
                                  • Бағалау ұпайлары4
                                  m
                                  • molni99
                                  • Қаз. 26, 2024, 1:29 Т.Ж.

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

                                  • Нәтиже:20ұпай,
                                  • Бағалау ұпайлары-10
                                  Соңғы пікірлер
                                  ИМ
                                  Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                                  Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                                  Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                  A
                                  ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                                  Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                                  Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                  QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  Енді форумда талқылаңыз
                                  m
                                  moogoҚар. 22, 2024, 7:17 Т.Ж.
                                  Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  t
                                  tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                  NSProject
                                  NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                  Бізді әлеуметтік желілерде бақылаңыз