М
Миша29 листопада 2017 р. 05:07

Сигнал от кнопки

Qt, сигналы, слоты

Здравствуйте.

Добавил кнопку  PushButton1 на интерфейс.
Нажал перейти к слоту->clicked()
Создал в хедере
private slots:
    void on_PushButton1_clicked();
В срр:
void MainWindow::on_PushButton1_clicked()
{
    makePlot();
}
Скажите пожалуйста как в конструкторе класса прописать connect(), чтобы при нажатии кнопки PushButton1 вызывался слот on_PushButton1_clicked() ?
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

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

12
Evgenii Legotckoi
  • 29 листопада 2017 р. 05:11

Здравствуйте!
Этот слот должен был создаться автоматически, если я вас правильно понял (то есть вы создали его через контекстное меню в графическом дизайнере)

А это значит, что вам не нужно делать в данном конкретном случае какой-либо коннект. Все эти коннекты будут созданы в автоматически генерируемом хедере.
    М
    • 29 листопада 2017 р. 05:15

    Но при нажатии на кнопку ничего не происходит. А мне нужно выполнить makePlot();

      Evgenii Legotckoi
      • 29 листопада 2017 р. 05:20
      • (відредаговано)

      А вот это уже странно. Должно было работать. Но по факту коннект должен выглядеть примерно так:

      connect(ui->PushButton1, &QPushButton::clicked, this, &MainWindow::on_PushButton1_clicked);
      Вместо MainWindow соответственно название вашего класса, в котором создана кнопка.

      На всякий случай, закиньте вывод qDebug() в этот слот, чтобы проверить, вызывается ли этот слот в принципе.
      void MainWindow::on_PushButton1_clicked()
      {
          qDebug() << "Этот слот был вызван";
          makePlot();
      }
      Если в консоли будет вывод этого qDebug(), то ищите ошибку в makePlot();
        М
        • 29 листопада 2017 р. 05:26

        Сделал. Но не работает, qDebug () ничего не выдает.

          Evgenii Legotckoi
          • 29 листопада 2017 р. 05:29

          Сделали коннект, как я написал?
          хм.. удалите билд и пересоберите проект. Такое ощущение, что у вас битый сгенерированный заголовочник или ещё что-то в этом духе.

          Либо Вы что-то недоговариваете.
          Задача слишком уже тривиальная, чтобы там можно было допустить ошибку.
            М
            • 29 листопада 2017 р. 05:37

            Все так. Но не работает. Сначала сделал 3 кнопки и продублировал Ваше решение для 3-х.

            Сейчас оставил только одну, затер 2 коннекта, остальное оставил.
            При выполнении программы выдало
            QMetaObject::connectSlotsByName: No matching signal for on_PushButton2_clicked()

            QMetaObject::connectSlotsByName: No matching signal for on_PushButton3_clicked()

            Следовательно сигнал все же идет от кнопки. Но видимо ошибка в его приеме.


              М
              • 29 листопада 2017 р. 05:39

              Может быть нужно что то в файл проект дописать?


                М
                • 29 листопада 2017 р. 05:59

                Хотя в другом проекте работает, странно, буду искать ошибку.

                  Evgenii Legotckoi
                  • 29 листопада 2017 р. 06:00

                  Ничего не нужно дописывать в pro-файл. Нужно удалить через дизайнер второй и третий слоты.
                  В данном случае недостаточно просто затереть в хедере слоты кнопок.

                    М
                    • 29 листопада 2017 р. 06:11

                    Как оказалось кнопка работает, если на ui не построен график. График использует сигналы мышки для перетаскивания и масштабирования. Скажите пожалуйста, как выйти из этой ситуации.

                    void MainWindow::MakeEquiti()
                    {
                        //qDebug()<<Equity1.size()<<NBar;
                        int NTikers=10;
                        long long FirstVisibleBar=0;//возвращает видимый левый край
                        long long LastVisibleBar=Equity1.size() -1; //возвращает видимый правый край
                        double YLow;  //видимый лой по оси у
                        double YHigh; //видимый хай по оси у
                        long long NGraph=0;   //номер графика при добавлении графиков и точек
                        QVector<double>bar(Equity1.size());
                        for (long long i=0; i<Equity1.size(); i++)
                        {
                    
                            bar[i]=i;
                        }
                        // --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                    
                        //  тут описание виджета пошло
                        ui->customPlot->close();//закрывает виджет
                        ui->setupUi(this);  //открывает виджет
                    
                        ui->customPlot->legend->setVisible(true);
                    
                        // создание свечей // create candlestick chart:
                        QCPGraph *EquitiGraphic=new QCPGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);
                        EquitiGraphic->setName("Equiti");
                        EquitiGraphic->setLineStyle(QCPGraph::lsImpulse);
                        EquitiGraphic->setData ( bar, Equity1 ); // Устанавливаем данные
                        QPen PenE;
                        PenE.setColor(QColor(Qt::green));//цвет QPen
                        EquitiGraphic->setPen(PenE);
                    
                    
                    
                        // тикеры оси х -----------------------------------------------------------------------------------------
                        QSharedPointer <QCPAxisTickerText> textTicker ( new  QCPAxisTickerText );
                        ui->customPlot-> xAxis-> setTicker (textTicker);
                        textTicker->clear();//удаляет тикеры
                        ui->customPlot->xAxis->setBasePen(Qt::NoPen);
                        // ui->customPlot->xAxis->setTickLabels(false); //Устанавливает, отображаются ли метки метки. Тик-метки - это числа, набранные рядом с отметками.
                        ui->customPlot->xAxis->setTicks(true); //только для вертикальную сетку в основной прямоугольник по оси, чтобы скрыть основу абсцисс, засечки и надписи  // only want vertical grid in main axis rect, so hide xAxis backbone, ticks, and labels
                        //ui->customPlot->xAxis->setRange(FirstVisibleBar,LastVisibleBar); //задается отражаемая часть графика
                        if (NTikers>Equity1.size()){NTikers=Equity1.size();}
                        int StepTickers=(LastVisibleBar - FirstVisibleBar)/NTikers;//шаг тикероа
                        for  (int i=0; i<=NTikers; i++) //задает тики
                        {
                            if (FirstVisibleBar +i*StepTickers<Equity1.size()){   textTicker->addTick(FirstVisibleBar +i*StepTickers, TimeEquiti1[FirstVisibleBar +i*StepTickers].toString("HH:mm")+'\n'+DateEquiti1[FirstVisibleBar +i*StepTickers].toString("dd.MM.yyyy"));}
                        }
                        //сделать ось выпрямляет левую сторону линии вверх: // make axis rects' left side line up:
                        QCPMarginGroup *group = new QCPMarginGroup(ui->customPlot);
                        ui->customPlot->axisRect()->setMarginGroup(QCP::msLeft|QCP::msRight, group);
                        // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                        // ниже мой код относительно графика
                        ui->customPlot->setInteraction(QCP::iRangeZoom,true);   // Включаем взаимодействие удаления/приближения
                        ui->customPlot->setInteraction(QCP::iRangeDrag, true);  // Включаем взаимодействие перетаскивания графика
                        ui->customPlot->axisRect()->setRangeDrag(Qt::Horizontal);   // Включаем перетаскивание только по горизонтальной оси
                        ui->customPlot->axisRect()->setRangeZoom(Qt::Horizontal);   // Включаем удаление/приближение только по горизонтальной оси
                        ui->customPlot->xAxis->setTickLabels(true);  //Устанавливает, отображаются ли метки метки. Тик-метки - это числа, набранные рядом с отметками.
                        ui->customPlot->legend->setVisible(true);   //Включаем Легенду графика
                        // Устанавливаем Легенду в левый верхний угол графика
                        ui->customPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignLeft|Qt::AlignTop);
                    
                    
                        // -------------------------------------------------------------------------------------------------------------------------------------------------------------------
                        // Добавление линии
                        if (BuyAndHold1.size()>0)
                        {
                            NGraph=NGraph+1;
                            ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);  //Создает новый график внутри сюжета
                            ui->customPlot->graph(NGraph)->setName("BuyAndHold");
                            QPen Pen1;
                            Pen1.setColor(QColor(Qt::blue));
                            Pen1.setWidthF(1);//ширина линии
                            ui->customPlot->graph(NGraph)->setPen(Pen1);
                           // ui->customPlot->graph(NGraph)->setPen(QPen(Qt::red)); // Возвращает граф с индексом . Если индекс недействителен, он возвращает 0. -> line color blue for first graph
                            ui->customPlot->graph(NGraph)->setData(bar, BuyAndHold1);//сообщает данные графику
                        // Определяю Макс и мин видимый
                            for (long long i=FirstVisibleBar; i<LastVisibleBar; i++)
                            {
                                if (BuyAndHold1[i]<YLow )   {YLow=BuyAndHold1[i];}
                                if (BuyAndHold1[i]>YHigh )  {YHigh=BuyAndHold1[i];}
                            }
                        }
                    
                        if (BuyEquiti1.size()>0)
                        {
                            NGraph=NGraph+1;
                            ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);  //Создает новый график внутри сюжета
                            ui->customPlot->graph(NGraph)->setName("BuyEquiti");
                            QPen Pen1;
                            Pen1.setColor(QColor(Qt::red));
                            Pen1.setWidthF(1);//ширина линии
                            ui->customPlot->graph(NGraph)->setPen(Pen1);
                           // ui->customPlot->graph(NGraph)->setPen(QPen(Qt::red)); // Возвращает граф с индексом . Если индекс недействителен, он возвращает 0. -> line color blue for first graph
                            ui->customPlot->graph(NGraph)->setData(bar, BuyEquiti1);//сообщает данные графику
                        // Определяю Макс и мин видимый
                            for (long long i=FirstVisibleBar; i<LastVisibleBar; i++)
                            {
                                if (BuyEquiti1[i]<YLow )   {YLow=BuyEquiti1[i];}
                                if (BuyEquiti1[i]>YHigh )  {YHigh=BuyEquiti1[i];}
                            }
                        }
                        if (ShortEquiti1.size()>0)
                        {
                            NGraph=NGraph+1;
                            ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);  //Создает новый график внутри сюжета
                            ui->customPlot->graph(NGraph)->setName("ShortEquiti");
                            QPen Pen1;
                            Pen1.setColor(QColor(Qt::magenta));
                            Pen1.setWidthF(1);//ширина линии
                            ui->customPlot->graph(NGraph)->setPen(Pen1);
                           // ui->customPlot->graph(NGraph)->setPen(QPen(Qt::red)); // Возвращает граф с индексом . Если индекс недействителен, он возвращает 0. -> line color blue for first graph
                            ui->customPlot->graph(NGraph)->setData(bar, ShortEquiti1);//сообщает данные графику
                        // Определяю Макс и мин видимый
                            for (long long i=FirstVisibleBar; i<LastVisibleBar; i++)
                            {
                                if (ShortEquiti1[i]<YLow )   {YLow=ShortEquiti1[i];}
                                if (ShortEquiti1[i]>YHigh )  {YHigh=ShortEquiti1[i];}
                            }
                        }
                    
                        ui->customPlot->rescaleAxes();
                    
                        // -------------------------------------------------------------------------------------------------------------------------------------------------------------------
                        // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                        //авто масштабирует по оси Y
                    
                        FirstVisibleBar=ui->customPlot->xAxis->range().lower/1 ; //возвращает видимый левый край
                        LastVisibleBar=ui->customPlot->xAxis->range().upper/1 ; //возвращает видимый правый край
                        //ui->customPlot->yAxis->setRange(YLow-(ui->customPlot->yAxis->range().size()*0.05),YHigh+(ui->customPlot->yAxis->range().size()*0.05)); //задает размеры окна по оси У
                        ui->customPlot->QCustomPlot::axisRects ();
                    
                        QObject::connect(ui->customPlot->xAxis,static_cast<void(QCPAxis::*)(const QCPRange&)> (&QCPAxis::rangeChanged), [=]()  //сигнал изменения видимого диапазона
                        {
                            //ось yAxis, для основного графика
                            long long  FirstVisibleBar=ui->customPlot->xAxis->range().lower/1 ; //возвращает видимый левый край
                            long long  LastVisibleBar=ui->customPlot->xAxis->range().upper/1 ; //возвращает видимый правый край
                            if (LastVisibleBar>=Equity1.size()) {ui->customPlot->xAxis->setRangeUpper(Equity1.size());}  //граница графика справа
                            if (FirstVisibleBar<=0) {ui->customPlot->xAxis->setRangeLower(-1);}  //граница графика слева
                            if (FirstVisibleBar>=Equity1.size()) {FirstVisibleBar=(Equity1.size()-1);}  //если превышен диамазон массивов
                            if (FirstVisibleBar<0) {FirstVisibleBar=0;}         //если превышен диамазон массивов
                            if (LastVisibleBar>Equity1.size()) {LastVisibleBar=Equity1.size();}         //если превышен диамазон массивов
                            if (LastVisibleBar<=0) {LastVisibleBar=1;}          //если превышен диамазон массивов
                            double YLow=Equity1[FirstVisibleBar];       //локальный минимум
                            double YHigh=Equity1[FirstVisibleBar];     //локальный максимум
                            for (long long i=FirstVisibleBar; i<LastVisibleBar; i++)
                            {
                                if (Equity1[i]<YLow)   {YLow=Equity1[i];}
                                if (Equity1[i]>YHigh) { YHigh=Equity1[i];}
                                if (BuyAndHold1.size()>0)
                                {
                                    if (BuyAndHold1[i]<YLow&&BuyAndHold1[i]!=0)   {YLow=BuyAndHold1[i];}
                                    if (BuyAndHold1[i]>YHigh)  {YHigh=BuyAndHold1[i];}
                                }
                                if (BuyEquiti1.size()>0)
                                {
                                    if (BuyEquiti1[i]<YLow&&BuyEquiti1[i]!=0)   {YLow=BuyEquiti1[i];}
                                    if (BuyEquiti1[i]>YHigh)  {YHigh=BuyEquiti1[i];}
                                }
                                if (ShortEquiti1.size()>0)
                                {
                                    if (ShortEquiti1[i]<YLow&&ShortEquiti1[i]!=0)   {YLow=ShortEquiti1[i];}
                                    if (ShortEquiti1[i]>YHigh)  {YHigh=ShortEquiti1[i];}
                                }
                            }
                            ui->customPlot->yAxis->setRange(YLow-((YHigh-YLow)*0.05),YHigh+((YHigh-YLow)*0.05)); //задает размеры окна по оси У
                            //тикеры
                            textTicker->clear();//удаляет тикеры
                            //if (NTikers>Equity1.size()){NTikers=Equity1.size();}
                            int StepTickers=(LastVisibleBar - FirstVisibleBar)/NTikers;//шаг тикероа
                            for  (int i=0; i<=NTikers; i++) //задает тики
                            {
                                if (FirstVisibleBar +i*StepTickers<Equity1.size()){ textTicker->addTick(FirstVisibleBar +i*StepTickers, TimeEquiti1[FirstVisibleBar +i*StepTickers].toString("HH:mm")+'\n'+DateEquiti1[FirstVisibleBar +i*StepTickers].toString("dd.MM.yyyy"));}
                            }
                    
                        });
                    
                    }

                     

                      Evgenii Legotckoi
                      • 29 листопада 2017 р. 06:28
                      • (відредаговано)

                      А я вам уже говорил, что Вы делаете грубые костыли, которые даже зелёные новички не пишут.
                      Скорее всего причина в этих строчках.

                      //  тут описание виджета пошло
                      ui->customPlot->close();//закрывает виджет
                      ui->setupUi(this);  //открывает виджет
                      Вы в курсе что делает метод setupUi() ? Он создаёт новые объекты, создаёт новый интерфейс, но не удаляет старые объекты!!!!!
                      Появляются утечки памяти. Неправильное поведение сигналов и слотов, многократное перекопирование интерфейса... Но вы меня не послушали... Теперь разгребаете новые проблемы.
                      Исправьте эту проблему и скорее всего ваша текущая проблема разрешится сама собой. Без созданного графика же всё работает. А как только таким грубым костылём перерисовываете весь интерфейс, то у вас уже кнопки не знают куда цепляться, к каким слотам.
                        М
                        • 29 листопада 2017 р. 07:35

                        Спасибо. Затер эти строчки и кнопка заработал.

                          Коментарі

                          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,>…

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