KL
Қаң. 23, 2017, 11:39 Т.Қ.

Сигналы и слоты

Qt, Signal, Slot

Добрый вечер. Приложение состоит из двух классов А и В. В классе А осуществляется визуализация. В классе B реализуется работа с сетью.

 connect(&pageYandexTic,SIGNAL(finished(QNetworkReply*)), SLOT(on_load(QNetworkReply*)));
    connect(&pageGoogle, SIGNAL(loadFinished(bool)), this, SLOT(readHtmlGoogle())); // сигнал loadFinished вызывается по окончании загрузки интернет страницы
   connect(&pageGoogle, SIGNAL(loadProgress(int)), this, SLOT(loadProgressGoogle(int)));
Класс А содержит прогресс бар. Необходимо связать загрузку страницы с загрузкой прогресс бара. В connect прописано this, а необходимо использовать слот из класса А. Подскажите пожалуйста как это реализовать.
0
Сұрақ мақалада қойыладыQt/C++ - 024-сабақ. Qt5-тегі сигналдар мен слоттар

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

15
Evgenii Legotckoi
  • Қаң. 24, 2017, 6:25 Т.Ж.

Добрый день.
вместо this поставить указатель или ссылку на требуемый объект.

connect(&pageGoogle, SIGNAL(loadProgress(int)), &pageGoogle, SLOT(loadProgressGoogle(int)));
    KL
    • Қаң. 24, 2017, 10:13 Т.Қ.

    Получилось, подскажите, как сделать сигнал передающий значение int

      KL
      • Қаң. 24, 2017, 10:13 Т.Қ.

      Получилось, подскажите, как сделать сигнал передающий значение int

        C
        • Қаң. 25, 2017, 6:01 Т.Ж.

        не совсем понятный вопрос. Если объявить сигнал то:

        signals:
        void signalName(int arg1);
        если вызвать то:
        emit signalName(arg1);
          KL
          • Қаң. 25, 2017, 1:55 Т.Қ.

          Отлично работает, спасибо.

            KL
            • Қаң. 25, 2017, 4:39 Т.Қ.
             connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(on_Result(QNetworkReply*)));
             connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(on_Result_2(QNetworkReply*)));
            Возможно сделать переназначение слотов в одной программе. Например первый connect описан при одном нажатии кнопки, а второй вариант применяется при втором нажатии кнопки? Пример применения в QNetworkAccessNetwork первый слот применяется для загрузки XML документа, а второй для загрузки изображений.
              KL
              • Қаң. 25, 2017, 4:42 Т.Қ.

              Или лучше использовать два разных менеджера загрузки?

                Evgenii Legotckoi
                • Қаң. 25, 2017, 4:47 Т.Қ.

                Думаю, что возможно.

                В URL же указывается расширение файла. Во всяком случае это будет справедливо для файлов изображений. Поэтому можно развести всё через условия.

                QString urlStr = "http://url_to_file/image.jpg"; 
                
                if (urlStr.endsWith(".jpg")
                {
                    connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(on_Result(QNetworkReply*)));
                }
                else
                {
                    connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(on_Result_2(QNetworkReply*)));
                }

                Что касается двух менеджеров загрузки, то тут не знаю. Нужно отталкиваться от архитектуры приложения, но в вашем случае, думаю, что можно и одним обойтись. Просто раскидать всё через условия.

                  KL
                  • Қаң. 25, 2017, 5:31 Т.Қ.

                  По моему выполняется два коннекта.

                    Evgenii Legotckoi
                    • Қаң. 25, 2017, 5:36 Т.Қ.

                    С чего бы вдруг? Если url один, то и коннект будет один. Один коннект на один url

                      KL
                      • Қаң. 26, 2017, 4:50 Т.Ж.

                      У меня чуток другое применение нежели описали вы. У меня методы выполнялись поочередно. Сначала один, потом второй. При повторном вызове, сигнал конца загрузки вызывал два слота. (Могу ошибаться)

                        Evgenii Legotckoi
                        • Қаң. 26, 2017, 10:07 Т.Ж.

                        Ну а в чём же тогда вопрос? Если применение другое и логика обработки отличны от того, что я предложил. А вообще, не видя кода, не могу ничего более сказать.

                          KL
                          • Қаң. 28, 2017, 6:35 Т.Қ.
                          {
                           connect(&Page,SIGNAL(loadFinished(bool)), SLOT(on_load()));   // В конструкторе класса
                          }
                          void MyClass:: on_load()
                          {
                          qDebug()<<"on_load";
                          }
                          void MyClass::on_pushButton_clicked()
                          {
                           url.setUrl("http://gazetax.ru/otzivi-za-dengi.php");
                               Page.mainFrame()->load(url);
                              connect(&Page,SIGNAL(loadFinished(bool)), SLOT(on_load_Page()));
                          }
                          void MyClass::on_load_Page()
                          {
                          qDebug()<<"on_load_Page";
                          }
                          В qDebug отображается 2 коннекта. Подскажите, как заблокировать выполнение сигнала находящегося в конструкторе?
                            Evgenii Legotckoi
                            • Қаң. 28, 2017, 9:21 Т.Қ.
                            • Жауап шешім ретінде белгіленді.

                            Можно отключить коннект и подключить его заново.

                            {
                                connect(&Page,SIGNAL(loadFinished(bool)), SLOT(on_load()));   // В конструкторе класса
                            }
                            
                            void MyClass:: on_load()
                            {
                                qDebug()<<"on_load";
                            }
                            
                            void MyClass::on_pushButton_clicked()
                            {
                                disconnect(&Page,SIGNAL(loadFinished(bool)), SLOT(on_load())); 
                                url.setUrl("http://gazetax.ru/otzivi-za-dengi.php");
                                Page.mainFrame()->load(url);
                                connect(&Page,SIGNAL(loadFinished(bool)), SLOT(on_load_Page()));
                            }
                            
                            void MyClass::on_load_Page()
                            {
                                connect(&Page,SIGNAL(loadFinished(bool)), SLOT(on_load())); 
                                qDebug()<<"on_load_Page";
                            }
                              KL
                              • Қаң. 28, 2017, 11:35 Т.Қ.

                              Отлично, спасибо.

                                Пікірлер

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