KL
Konstantin Lazarev31 січня 2017 р. 09:34

QNetworkAccessManager определение позиции сайта в Google по запросу

Code Review

Написал приложение по определению позиции сайта в выдаче по запросу и определение ТИЦ первой 10. Хочу получить комментарии к коду и какие элементы кода программы стоит доработать.

position.h
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

6
KL
  • 31 січня 2017 р. 09:37
#ifndef POSITION_H
#define POSITION_H

#include <QMainWindow>
#include "network_my.h"
#include "makesaytslist.h"

namespace Ui {
class Position;
}

class Position : public QMainWindow
{
    Q_OBJECT

public:
    explicit Position(QWidget *parent = 0);
    ~Position();

private slots:
    void on_pushButton_clicked();
    void setResults();
    void setImage();


private:
    Ui::Position *ui;
    network_my Network;
    MakeSaytsList Make;
};

#endif // POSITION_H

    KL
    • 31 січня 2017 р. 09:38
    #include "position.h"
    #include "ui_position.h"
    #include <QDebug>
    Position::Position(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Position)
    {
        ui->setupUi(this);
        ui->lineEdit_2->setText("gazetax.ru");
        ui->comboBox->addItem("google.ru");
           ui->comboBox->addItem("google.com.ua");
           connect(&Network,SIGNAL(PageDownload()),this,SLOT(setResults()));
           connect(&Network,SIGNAL(ImageDownload()),this,SLOT(setImage()));
    }
    
    Position::~Position()
    {
        delete ui;
    }
    
    void Position::on_pushButton_clicked()
    {
    
        Network.setMainPage(Make.MakeGoogleQuery(ui->comboBox->currentText(), ui->lineEdit->text()));
    }
    
    void Position::setResults()
    {
        QStringList ListSayt;
        ui->plainTextEdit->clear();   // очистка поля
            ListSayt=Network.getListSaytsGoogle();    // Возвращает список сайтов из выдачи 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_2->text())
                    {
                         counter_2++;
                       ui->lcdNumber->display(++i);
                       break;
                    }
                }
                if(counter_2==0)
                {
                    ui->lcdNumber->display(0);
                }
                Network.setImageForTic();
    }
    
    void Position::setImage()
    {
    
            ui->label->setPixmap(Network.getImage(0));
            ui->label_2->setPixmap(Network.getImage(1));
            ui->label_3->setPixmap(Network.getImage(2));
            ui->label_4->setPixmap(Network.getImage(3));
            ui->label_5->setPixmap(Network.getImage(4));
            ui->label_6->setPixmap(Network.getImage(5));
            ui->label_7->setPixmap(Network.getImage(6));
            ui->label_8->setPixmap(Network.getImage(7));
            ui->label_9->setPixmap(Network.getImage(8));
            ui->label_10->setPixmap(Network.getImage(9));
    
    }
    
    
      KL
      • 31 січня 2017 р. 09:39
      #ifndef NETWORK_MY_H
      #define NETWORK_MY_H
      #include <QObject>
      #include <QNetworkAccessManager>
      #include <QNetworkRequest>
      #include <makesaytslist.h>
      #include <QPixmap>
      class network_my: public QObject
      {
          Q_OBJECT
      public:
          network_my(QObject *parent=0);
          void setMainPage(QString NameSayte); // Парсит выбраный вами файл или запрос
          QStringList getListSaytsGoogle();
          void setImageForTic();
          QPixmap getImage(int i);
      
      private:
          QString MainPage; //  Содержимое спарсеного документа
          QNetworkAccessManager manager;  // Класс для работы с сетью
          QNetworkRequest request;
          MakeSaytsList Make;
          QVector<QPixmap> pixmap;// Вектор картинок с тицом сайтов
          QStringList SaytListForTic; // Список сайтов из выдачи гугла
          int counter; //Счетчик для загрузки изображений
      private slots:
          void ParsingMainPage(QNetworkReply *reply);
          void DownloadImage(QNetworkReply*reply);
          void DisconnectSignals();
          void DownloadImageForTic(int i);
      signals:
          void PageDownload();
          void ImageDownload();
      };
      
      #endif // NETWORK_MY_H
      
      
        KL
        • 31 січня 2017 р. 09:39
        #include "network_my.h"
        #include <QUrl>
        #include <QDebug>
        #include <QNetworkReply>
        network_my::network_my(QObject *parent):QObject(parent)
        {
        
        }
        
        void network_my::setMainPage(QString NameSayte)
        {
            DisconnectSignals();
            connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(ParsingMainPage(QNetworkReply*)));
            QUrl url;
               url.setUrl(NameSayte);
               request.setUrl(url);
               manager.get(request);
        }
        
        QStringList network_my::getListSaytsGoogle()
        {
            return Make.SaytsList(MainPage);
        }
        
        void network_my::setImageForTic()
        {
              DisconnectSignals();
             connect(&manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(DownloadImage(QNetworkReply*)));
             SaytListForTic=Make.SaytsList(MainPage);
             pixmap.clear();
             counter=0;
             DownloadImageForTic(counter);
        }
        
        QPixmap network_my::getImage(int i)
        {
            return pixmap.at(i);
        }
        
        void network_my::ParsingMainPage(QNetworkReply* reply)
        {
            if(reply->error())
            {
                        qDebug() << "ERROR";
                        qDebug() << reply->errorString(); //проверка полученого текста на ошибки
                    }
            else {
                        MainPage=QString::fromUtf8(reply->readAll());
                        reply->deleteLater();
                        emit PageDownload();
            }
        }
        
        void network_my::DownloadImage(QNetworkReply *reply)
        {
            QPixmap picture;
               picture.loadFromData(reply->readAll());
               pixmap.push_back(picture);
               counter++;
               DownloadImageForTic(counter);
               reply->deleteLater();
        }
        
        void network_my::DisconnectSignals()
        {
            disconnect(&manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(ParsingMainPage(QNetworkReply*)));
            disconnect(&manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(DownloadImage(QNetworkReply*)));
        }
        
        void network_my::DownloadImageForTic(int i)
        {
            QUrl url;
            if(i<10)
               {
               url.setUrl("http://www.yandex.ru/cycounter?"+SaytListForTic[i]+"");
               request.setUrl(url);
               manager.get(request);
               }
               else
               {
                counter=0;
                emit ImageDownload();
                /*
                    urlGoogle.setUrl( Make.MakeGoogleQueryAdvertising(Google_Region, Query_User));
                     request.setUrl(urlGoogle);
                    managerAdvertising.get(request);
                   counter=0;
                   */
               }
        
        }
        
        
          Evgenii Legotckoi
          • 31 січня 2017 р. 11:12
          • Відповідь була позначена як рішення.

          1. В Qt используется стиль Camel Style для написания названий классов и методов. Стоит придерживаться этого стиля. Поэтому лучше переименовть network_my в NetworkMy или MyNetwork

          2.

          connect(&Network,SIGNAL(PageDownload()),this,SLOT(setResults()));
          

          Это устаревший синтаксис сигналов и слотов, в котором не отлавливаются ошибки на этапе компиляции. В крупном проекте это чревато нудным и долгим поиском проблемы. Используйте новый синтаксис на указателях.

          connect(button, &QPushButton::clicked, this, &MainWindow::slotButton);
          

          3. Вот это просто некрасиво выглядит. Я бы переписал с динамическим созданием компонентов.

          ui->label->setPixmap(Network.getImage(0));
          ui->label_2->setPixmap(Network.getImage(1));
          ui->label_3->setPixmap(Network.getImage(2));
          ui->label_4->setPixmap(Network.getImage(3));
          ui->label_5->setPixmap(Network.getImage(4));
          ui->label_6->setPixmap(Network.getImage(5));
          ui->label_7->setPixmap(Network.getImage(6));
          ui->label_8->setPixmap(Network.getImage(7));
          ui->label_9->setPixmap(Network.getImage(8));
          ui->label_10->setPixmap(Network.getImage(9));
          

          4. Перемудрили вот c этим кодом:

          int counter_2=0;
                      for(int i=0; i<ListSayt.size(); i++)  // Определяет позицию искомого сайта
                      {
                          if(ListSayt[i]==ui->lineEdit_2->text())
                          {
                               counter_2++;
                             ui->lcdNumber->display(++i);
                             break;
                          }
                      }
                      if(counter_2==0)
                      {
                          ui->lcdNumber->display(0);
                      }
          

          Вот так будет явно проще и более красиво:

          ui->lcdNumber->display(ListSayt.indexOf(ui->lineEdit_2->text()) + 1 );
          

          5. И здесь тоже много лишнего:

          QString number;
                     number=QString::number(1+i);
                      ui->plainTextEdit->appendPlainText(number+" "+ListSayt[i]);
          

          Лучше так:

          ui->plainTextEdit->appendPlainText(QString::number(1+i)+" "+ListSayt[i]);
          

          6. Ну и код стайл. Грязновато написано, отступы, скобки и т.д. по всему коду. Много перечислять.

          7. Если покопаться, то можно ещё много нарыть думаю, но пока и этого хватит.

            KL
            • 31 січня 2017 р. 11:48

            Спасибо, попробую исправить. Без помощи знающих людей сложно чему то учиться. Благодарен вам за помощь!

              Коментарі

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

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

              • Результат:90бали,
              • Рейтинг балів8
              МВ

              Qt - Тест 001. Сигналы и слоты

              • Результат:68бали,
              • Рейтинг балів-1
              ЛС

              C++ - Тест 001. Первая программа и типы данных

              • Результат:53бали,
              • Рейтинг балів-4
              Останні коментарі
              A
              ALO1ZE19 жовтня 2024 р. 08:19
              Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов05 жовтня 2024 р. 07:51
              Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas505 липня 2024 р. 11:02
              QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssr08 лютого 2024 р. 18:43
              Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий Кононенко05 лютого 2024 р. 01:50
              Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Тепер обговоріть на форумі
              J
              JacobFib17 жовтня 2024 р. 03:27
              добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
              ИМ
              Игорь Максимов03 жовтня 2024 р. 04:05
              Реализация навигации по разделам Спасибо Евгений!
              JW
              Jhon Wick01 жовтня 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 вересня 2024 р. 09:09
              Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
              F
              Fynjy22 липня 2024 р. 04:15
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

              Слідкуйте за нами в соціальних мережах