KL
Konstantin Lazarev26. Januar 2017 08:17

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

QNetworkAccessManager, Image, QLabel

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

16
KL
  • 26. Januar 2017 08:19

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

    KL
    • 26. Januar 2017 09:04

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

      KL
      • 26. Januar 2017 09:05

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

        KL
        • 26. Januar 2017 09:05

        Интерфейс

          KL
          • 26. Januar 2017 09:05

          Интерфейс

            KL
            • 26. Januar 2017 09: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. Januar 2017 09: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. Januar 2017 09: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. Januar 2017 09: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. Januar 2017 09:30
                    • Die Antwort wurde als Lösung markiert.

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

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

                    QVector<QPixmap> pixmaps;
                    

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

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

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

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

                      KL
                      • 26. Januar 2017 09:43

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

                        Evgenii Legotckoi
                        • 26. Januar 2017 09: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. Januar 2017 09:56

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

                            KL
                            • 26. Januar 2017 10:50

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

                              KL
                              • 26. Januar 2017 11:00

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

                                Evgenii Legotckoi
                                • 26. Januar 2017 11:03

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

                                  Kommentare

                                  Nur autorisierte Benutzer können Kommentare posten.
                                  Bitte Anmelden oder Registrieren
                                  Letzte Kommentare
                                  A
                                  ALO1ZE19. Oktober 2024 08:19
                                  Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь Максимов5. Oktober 2024 07:51
                                  Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas55. Juli 2024 11:02
                                  QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  k
                                  kmssr8. Februar 2024 18:43
                                  Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  Jetzt im Forum diskutieren
                                  J
                                  JacobFib17. Oktober 2024 03:27
                                  добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                                  JW
                                  Jhon Wick1. Oktober 2024 15:52
                                  Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                                  КГ
                                  Кирилл Гусарев27. September 2024 09:09
                                  Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                                  F
                                  Fynjy22. Juli 2024 04:15
                                  при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                                  Folgen Sie uns in sozialen Netzwerken