KL
Konstantin LazarevҚаң. 31, 2017, 9:34 Т.Ж.

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

Code Review

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
KL
  • Қаң. 31, 2017, 9: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, 9: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, 9: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, 9: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 Т.Ж.

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

              Пікірлер

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

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

              • Нәтиже:66ұпай,
              • Бағалау ұпайлары-1
              t

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

              • Нәтиже:33ұпай,
              • Бағалау ұпайлары-10
              t

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

              • Нәтиже:52ұпай,
              • Бағалау ұпайлары-4
              Соңғы пікірлер
              G
              GoattRockҚыр. 3, 2024, 11:50 Т.Қ.
              Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
              d
              dblas5Шілде 5, 2024, 9:02 Т.Қ.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssrАқп. 9, 2024, 5:43 Т.Ж.
              Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий КононенкоАқп. 5, 2024, 12:50 Т.Қ.
              Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Енді форумда талқылаңыз
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              F
              FynjyШілде 22, 2024, 2:15 Т.Қ.
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
              BlinCT
              BlinCTМаусым 25, 2024, 11 Т.Ж.
              Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
              BlinCT
              BlinCTМамыр 5, 2024, 3:46 Т.Қ.
              Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
              Evgenii Legotckoi
              Evgenii LegotckoiМамыр 3, 2024, 12:07 Т.Ж.
              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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