М
Миша29 ноября 2017 г. 5: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 г. 5:11

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

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

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

      Evgenii Legotckoi
      • 29 ноября 2017 г. 5:20
      • (ред.)

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

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

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

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

          Evgenii Legotckoi
          • 29 ноября 2017 г. 5:29

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

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

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

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

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

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


              М
              • 29 ноября 2017 г. 5:39

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


                М
                • 29 ноября 2017 г. 5:59

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

                  Evgenii Legotckoi
                  • 29 ноября 2017 г. 6:00

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

                    М
                    • 29 ноября 2017 г. 6: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 г. 6:28
                      • (ред.)

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

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

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

                          Комментарии

                          Только авторизованные пользователи могут публиковать комментарии.
                          Пожалуйста, авторизуйтесь или зарегистрируйтесь
                          AD

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

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

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

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

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

                          • Результат:20баллов,
                          • Очки рейтинга-10
                          Последние комментарии
                          i
                          innorwall11 ноября 2024 г. 22:12
                          Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                          i
                          innorwall11 ноября 2024 г. 18:23
                          QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                          i
                          innorwall11 ноября 2024 г. 15:50
                          Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                          i
                          innorwall11 ноября 2024 г. 14:19
                          Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                          i
                          innorwall11 ноября 2024 г. 13:55
                          PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                          Сейчас обсуждают на форуме
                          i
                          innorwall11 ноября 2024 г. 20:56
                          добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                          i
                          innorwall11 ноября 2024 г. 10:55
                          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                          9
                          9Anonim25 октября 2024 г. 9:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                          ИМ
                          Игорь Максимов3 октября 2024 г. 4:05
                          Реализация навигации по разделам Спасибо Евгений!

                          Следите за нами в социальных сетях