KL
Konstantin Lazarev23. Januar 2017 12: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, а необходимо использовать слот из класса А. Подскажите пожалуйста как это реализовать.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

15
Evgenii Legotckoi
  • 23. Januar 2017 19:25

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

connect(&pageGoogle, SIGNAL(loadProgress(int)), &pageGoogle, SLOT(loadProgressGoogle(int)));
    KL
    • 24. Januar 2017 11:13

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

      KL
      • 24. Januar 2017 11:13

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

        C
        • 24. Januar 2017 19:01

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

        signals:
        void signalName(int arg1);
        
        если вызвать то:
        emit signalName(arg1);
        
          KL
          • 25. Januar 2017 02:55

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

            KL
            • 25. Januar 2017 05: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. Januar 2017 05:42

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

                Evgenii Legotckoi
                • 25. Januar 2017 05: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. Januar 2017 06:31

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

                    Evgenii Legotckoi
                    • 25. Januar 2017 06:36

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

                      KL
                      • 25. Januar 2017 17:50

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

                        Evgenii Legotckoi
                        • 25. Januar 2017 23:07

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

                          KL
                          • 28. Januar 2017 07: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. Januar 2017 10:21
                            • Die Antwort wurde als Lösung markiert.

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

                            {
                                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. Januar 2017 12:35

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

                                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