KL
Jan. 23, 2017, 11:39 p.m.

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

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
The question is asked by the articleQt/C++ - Lesson 024. Signals and Slot in Qt5

Do you like it? Share on social networks!

15
Evgenii Legotckoi
  • Jan. 24, 2017, 6:25 a.m.

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

connect(&pageGoogle, SIGNAL(loadProgress(int)), &pageGoogle, SLOT(loadProgressGoogle(int)));
    KL
    • Jan. 24, 2017, 10:13 p.m.

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

      KL
      • Jan. 24, 2017, 10:13 p.m.

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

        C
        • Jan. 25, 2017, 6:01 a.m.

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

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

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

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

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

                Evgenii Legotckoi
                • Jan. 25, 2017, 4:47 p.m.

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

                В 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
                  • Jan. 25, 2017, 5:31 p.m.

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

                    Evgenii Legotckoi
                    • Jan. 25, 2017, 5:36 p.m.

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

                      KL
                      • Jan. 26, 2017, 4:50 a.m.

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

                        Evgenii Legotckoi
                        • Jan. 26, 2017, 10:07 a.m.

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

                          KL
                          • Jan. 28, 2017, 6:35 p.m.
                          {
                           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
                            • Jan. 28, 2017, 9:21 p.m.
                            • The answer was marked as a solution.

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

                            {
                                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
                              • Jan. 28, 2017, 11:35 p.m.

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

                                Comments

                                Only authorized users can post comments.
                                Please, Log in or Sign up
                                • Last comments
                                • AK
                                  April 1, 2025, 11:41 a.m.
                                  Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                • Evgenii Legotckoi
                                  March 9, 2025, 9:02 p.m.
                                  К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                • VP
                                  March 9, 2025, 4:14 p.m.
                                  Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                                • ИМ
                                  Nov. 22, 2024, 9:51 p.m.
                                  Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                • Evgenii Legotckoi
                                  Oct. 31, 2024, 11:37 p.m.
                                  Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup