М
МишаNov. 8, 2017, 2:33 a.m.

Qt сигналы

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

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

12
М
  • Nov. 8, 2017, 2:48 a.m.

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

    Evgenii Legotckoi
    • Nov. 8, 2017, 3:27 a.m.

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

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

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

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

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

            Evgenii Legotckoi
            • Nov. 8, 2017, 8:31 a.m.

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

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

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

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

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

                Почитал документацию 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
                  • Nov. 8, 2017, 10:23 a.m.
                  обе они перегруженные ... методы не являются перегруженными если в классе существует только один метод с одним названием, если два и более с одним названием, то они все перегруженные.

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

                    Если так

                        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
                      • Nov. 8, 2017, 10:31 a.m.

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

                        М
                        • Nov. 8, 2017, 10:34 a.m.

                        Спасибо.

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

                          Comments

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

                          C ++ - Test 004. Pointers, Arrays and Loops

                          • Result:50points,
                          • Rating points-4
                          m

                          C ++ - Test 004. Pointers, Arrays and Loops

                          • Result:80points,
                          • Rating points4
                          m

                          C ++ - Test 004. Pointers, Arrays and Loops

                          • Result:20points,
                          • Rating points-10
                          Last comments
                          ИМ
                          Игорь МаксимовNov. 22, 2024, 10:51 p.m.
                          Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
                          Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZEOct. 19, 2024, 6:19 p.m.
                          Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь МаксимовOct. 5, 2024, 5:51 p.m.
                          Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas5July 5, 2024, 9:02 p.m.
                          QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Now discuss on the forum
                          m
                          moogoNov. 22, 2024, 6:17 p.m.
                          Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                          Evgenii Legotckoi
                          Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey1Nov. 15, 2024, 5:04 p.m.
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProjectJune 4, 2022, 1:49 p.m.
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                          Follow us in social networks