М
Миша08 листопада 2017 р. 02:33

Qt сигналы

сигнал, qt, qcustomplot.com

Здравствуйте. В функции void MainWindow::makePlot() я могу получать сигнал rangeChanged, говорящий о том, что изменился видимый диапазон оси. Скажите пожалуйста, могу ли я непосредственно в этой функции сделать обработчик этого сигнала?

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

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

12
М
  • 08 листопада 2017 р. 02:48

И как я понял сигнал rangeChanged выдается автоматически при смене видимого диапазона оси. Можно ли его использовать, заранее не задикларировав в классе?

    Evgenii Legotckoi
    • 08 листопада 2017 р. 03:27

    День добрый.
    Сигнал к слоту можно подключить в любой момент, также как и отключить. Главное, чтобы объект, который испускает сигнал существовал.

    Можно написать обработчик и внутри makePlot(), лямбда функции и стандарт сигналов и слотов в Qt5 это поддерживают.
    В статье про работу с QSignalMapper есть пример чисто лямбдами.
      М
      • 08 листопада 2017 р. 06:04

      Помогите пожалуйста. Пытаюсь вызвать сообщение после смещения оси х.

      connect(this, &QCPAxis::rangeChanged, [this](){
            QMessageBox::critical(NULL,QObject::tr("окошко"),tr("Ура, заработало " ));
         });
      Как я понял 1 слот отражает отправителя, второй сам сигнал. Скажите пожалуйста, что в случае лямбда функции должно быть в 3-ем слоте? Почему вы использовали квадратные скобки? Что значит [=]?
        М
        • 08 листопада 2017 р. 07:52
        • Узнал что [=] захват всех символов по значению, но остальное пока не понятно.
          М
          • 08 листопада 2017 р. 08:16

          Еще нашел документацию http://wiki.qt.io/New_Signal_Slot_Syntax стала немного понятней лямбда функция, но все равно не понятно как запустить мой пример.

            Evgenii Legotckoi
            • 08 листопада 2017 р. 08:31

            Структура люобой лямбды такова:

            []() -> void {};
            Квадратные скобки [] обозначают заватываемые переменные, объекты
            [=] - захватывает всё в доступной области видимости, полезно, когда много локальных переменных нужно захватить внутри метода. Полезно для сокращения кода.
            В круглых скобках обозначаются передаваемые аргументы, если это требуется в рамках слота в Qt.
            -> void - возвращаемое значение
            {} - тело функции.
              Evgenii Legotckoi
              • 08 листопада 2017 р. 08:35

              Думаю, что знаю, почему у Вас не работает.

              Там требуется делать static_cast сигнатуры сигнала, поскольку он перегруженный. Вот похожая ситуация с QComboBox

              Вот пример для QComboBox, у которого есть перегруженные сигналы также
              connect(comboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated),
                  [=](int index){ /* ... */ });
                М
                • 08 листопада 2017 р. 10:10

                Почитал документацию http://www.qcustomplot.com/documentation/classQCPAxis.html#a62b598abeee7174a05f9d542cc85b1f5 , как я понял, одна функция не перегруженная, вторая перегруженная.

                Тут http://www.qcustomplot.com/index.php/demos/simpledemo нашел пример, но он старого типа. Хочу сделать с новым типом.
                Пробовал сделать так :
                 QObject::connect(ui->customPlot->xAxis,static_cast<void(QCPAxis::*)(const QCPRange&)> (&QCPAxis::rangeChanged), [=](){
                          QMessageBox::critical(NULL,QObject::tr("окошко"),tr("Ура, заработало " ));
                       });
                
                Но не работает. Пробовал разные типы данных в static_cast. Помогите пожалуйста исправить до рабочей версии.
                  Evgenii Legotckoi
                  • 08 листопада 2017 р. 10:23
                  обе они перегруженные ... методы не являются перегруженными если в классе существует только один метод с одним названием, если два и более с одним названием, то они все перегруженные.

                  На первый взгляд всё правильно написано. Какую ошибку компилятор выдаёт?
                    М
                    • 08 листопада 2017 р. 10:27

                    Если так

                        QObject::connect(ui->customPlot->xAxis, &QCPAxis::rangeChanged, [=](){
                              QMessageBox::critical(NULL,QObject::tr("окошко"),tr("Ура, заработало " ));
                    });
                    то :
                    C:\Qt\project\MyCandleSrick\mainwindow.cpp:290: ошибка: no matching function for call to 'MainWindow::connect(QCPAxis*&, <unresolved overloaded function type>, MainWindow::makePlot()::__lambda0)'
                    });
                    если так
                        QObject::connect(ui->customPlot->xAxis,static_cast<void(QCPAxis::*)(const QCPRange&)> (&QCPAxis::rangeChanged), [=](){
                              QMessageBox::critical(NULL,QObject::tr("окошко"),tr("Ура, заработало " ));
                           });

                     

                    то тоже :
                    C:\Qt\project\MyCandleSrick\mainwindow.cpp:294: ошибка: no matching function for call to 'MainWindow::connect(QCPAxis*&, void (QCPAxis::*)(const QCPRange&), MainWindow::makePlot()::__lambda0)'
                    });
                    ^
                      Evgenii Legotckoi
                      • 08 листопада 2017 р. 10:31

                      В pro файле прописано CONFIG += c++11 . Может у вас просто 11-й стандарт не включён?

                        М
                        • 08 листопада 2017 р. 10:34

                        Спасибо.

                        Теперь работает :
                            QObject::connect(ui->customPlot->xAxis,static_cast<void(QCPAxis::*)(const QCPRange&)> (&QCPAxis::rangeChanged), [=](){
                                  QMessageBox::critical(NULL,QObject::tr("окошко"),tr("Ура, заработало " ));
                               });
                        Я думал оно автоматически использует этот стандарт((

                          Коментарі

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

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

                          • Результат:50бали,
                          • Рейтинг балів-4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 01:37

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

                          • Результат:80бали,
                          • Рейтинг балів4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 01:29

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

                          • Результат:20бали,
                          • Рейтинг балів-10
                          Останні коментарі
                          ИМ
                          Игорь Максимов22 листопада 2024 р. 11:51
                          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii Legotckoi31 жовтня 2024 р. 14:37
                          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          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 аналогично. Могу предположить, что из-за более новой верси…
                          Тепер обговоріть на форумі
                          Evgenii Legotckoi
                          Evgenii Legotckoi24 червня 2024 р. 15:11
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey115 листопада 2024 р. 06:04
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProject04 червня 2022 р. 03:49
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                          9
                          9Anonim25 жовтня 2024 р. 09:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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