Russian Qt Forum
Ноябрь 24, 2024, 07:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как связать переменную с спинбоксом !  (Прочитано 16063 раз)
Sergey
Гость
« : Август 03, 2010, 12:08 »

Здравствуйте !
Взял ф-цию  с примера , теперь надо свзять одну переменную внутри этой функции со спинбоксом.Знаю , что надо воспользоватся сигналом и слотом  но там разное кол-во аргументов в сигнале и слоте . Но как это изменить не знаю . Напишите пожалуйста как через connect coeдинить переменную i со спинбоксом .

Вот код :
Код:
void DataPlot::insertCurve(Qt::Orientation o,
    const QColor &c, double base)
{
    QwtPlotCurve *curve = new QwtPlotCurve();
  curve->setPen(QPen(Qt::blue,3));


     double i ;
    double x[10];
    double y[sizeof(x) / sizeof(x[0])];

    for ( uint k = 0; k < sizeof(x) / sizeof(x[0]); k++ )
    {
        double v = i+k * 1.5;
        if ( o == Qt::Horizontal )
        {
            x[k] = v;
            y[k] = base;
        }
        else
        {
            x[k] = base;
            y[k] = v;
        }
    }

    curve->setData(x, y, sizeof(x) / sizeof(x[0]));
    curve->attach(this);
}
Помогите пожалуйста.
Заранее благодарен
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Август 03, 2010, 13:12 »

1. Делаем сигнал:

Код:
signals:
    void signalNewI(double);

2. Делаем слот:
Код:
private slots:
    void slotUpdateSpinBox(double value);

Код:
void DataPlot::slotUpdateSpinBox(double value)
{
    this->yourSpinBox->setValue(value);
}

3. делаем коннект
Код:
connect(this, SIGNAL(signalNewI(double)), this, SLOT(slotUpdateSpinBox(double)));

4. в метод insertCurve добавляем:
Код:
void DataPlot::insertCurve(Qt::Orientation o,
    const QColor &c, double base)
{
    QwtPlotCurve *curve = new QwtPlotCurve();
  curve->setPen(QPen(Qt::blue,3));


     double i ;
    double x[10];
    double y[sizeof(x) / sizeof(x[0])];

    for ( uint k = 0; k < sizeof(x) / sizeof(x[0]); k++ )
    {
        double v = i+k * 1.5;
        if ( o == Qt::Horizontal )
        {
            x[k] = v;
            y[k] = base;
        }
        else
        {
            x[k] = base;
            y[k] = v;
        }
    }

    curve->setData(x, y, sizeof(x) / sizeof(x[0]));
    curve->attach(this);
    
    emit signalNewI(i); /// вот это добавили!!!

}

Или я не понял сути?

--

Упс, можно использовать сразу слот void QDoubleSpinBox::setValue(double val)



« Последнее редактирование: Август 03, 2010, 15:41 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Sergey
Гость
« Ответ #2 : Август 03, 2010, 15:24 »

я новичок , не совсем понял , что в данном контексте this ,потому что компилятор на него ругается)
спасибо , что помогаете)
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Август 03, 2010, 15:35 »

Ох...  Я так понимаю:
1. Вам нужно чтобы после того как вы ввели/изменили значение в QSpinBox автоматом вызывался слот insertCurve ?
Или
2. Необходимо чтобы после отработки слота insertCurve автоматом менялось значение в QSpinBox ?

---

Я пример привел для п.2.

Цитировать
я новичок , не совсем понял , что в данном контексте this ,потому что компилятор на него ругается
Ох... Надоже! Улыбающийся

[offtop]
И зачем же дублировать тему на http://www.qtcentre.org/threads/33009-how-connection-variable-in-functin-with-spinBox ?
Вы думаете, что "буржуины" вам помогут нежели "свои" ? Улыбающийся
[/offtop]

« Последнее редактирование: Август 03, 2010, 15:46 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Sergey
Гость
« Ответ #4 : Август 03, 2010, 15:53 »

чтоб вы правильно понимали insertCurve вызывает линию , которую пользователь должен передвигать благодаря изменениям в спинбоксе  )
 да , я знаю , что странные вопросы , ну что делать !) я написал в теме Вопросы новичков)  получается , если вам не сложно покажите как реализовать первый вариант .Улыбающийся

[offtop]
просто перед ними , не так стыдно как перед своими , но пока только вы мне помогаете , за что вам огромное спасибо ))  Улыбающийся
[/offtop]
« Последнее редактирование: Август 03, 2010, 16:14 от Sergey » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #5 : Август 03, 2010, 23:58 »

Всё решается гораздо проще )

Есть такой класс QwtPlotMarker у которого есть метод setValue..

А теперь смотрим пример (исходники) bode: Qwt/qwt-5.2.1/examples/bode/ - это то, что вы пытаетесь сделать, каким то окольным сомнительным путём))     

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Sergey
Гость
« Ответ #6 : Август 04, 2010, 14:46 »

Ох...  Я так понимаю:
1. Вам нужно чтобы после того как вы ввели/изменили значение в QSpinBox автоматом вызывался слот insertCurve ?
Или
2. Необходимо чтобы после отработки слота insertCurve автоматом менялось значение в QSpinBox ?

---

Я пример привел для п.2.

Цитировать
я новичок , не совсем понял , что в данном контексте this ,потому что компилятор на него ругается
Ох... Надоже! Улыбающийся

[offtop]
И зачем же дублировать тему на http://www.qtcentre.org/threads/33009-how-connection-variable-in-functin-with-spinBox ?
Вы думаете, что "буржуины" вам помогут нежели "свои" ? Улыбающийся
[/offtop]


Если не сложно покажите как для 1 варианта ... и я написал внизу , что должно получится , если есть вопросы ...спрашивайте )оч надо это сделать )
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Август 04, 2010, 14:59 »

Для п.1 нужно привязаться к сигналу от QDoubleSpinBox и выполнить нужный слот для перерисовки, т.е.

1. Создаем слот:
Код:
void DataPlot::slotProcChangeValueFromDoubleSpinBox(double i)
{
    Qt::Orientation orientation = XXX; //тут нужно присвоить нужное вам значение ориентации.. Как это сделать - вам виднее.
    QColor color = YYY; //тут нужно присвоить нужное вам значение цвета.. Как это сделать - вам виднее.
    double base = ZZZ; //тут нужно присвоить нужное вам значение .. Как это сделать - вам виднее.

    this->insertCurve(orientation , color ,  base, i); //это немного переделанный ваш метод в котором переменная i
                                                                         //подается на вход а не создается внутри метода (как у вас)!
}

2. Коннектим наш слот к сигналу от спинбокса:
Код:
connect(yuorDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotProcChangeValueFromDoubleSpinBox(double)));

как то так.

Записан

ArchLinux x86_64 / Win10 64 bit
Sergey
Гость
« Ответ #8 : Август 04, 2010, 16:27 »

Для п.1 нужно привязаться к сигналу от QDoubleSpinBox и выполнить нужный слот для перерисовки, т.е.

1. Создаем слот:
Код:
void DataPlot::slotProcChangeValueFromDoubleSpinBox(double i)
{
    Qt::Orientation orientation = XXX; //тут нужно присвоить нужное вам значение ориентации.. Как это сделать - вам виднее.
    QColor color = YYY; //тут нужно присвоить нужное вам значение цвета.. Как это сделать - вам виднее.
    double base = ZZZ; //тут нужно присвоить нужное вам значение .. Как это сделать - вам виднее.

    this->insertCurve(orientation , color ,  base, i); //это немного переделанный ваш метод в котором переменная i
                                                                         //подается на вход а не создается внутри метода (как у вас)!
}

2. Коннектим наш слот к сигналу от спинбокса:
Код:
connect(yuorDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotProcChangeValueFromDoubleSpinBox(double)));

как то так.


Не подскажите , почему на this ругается компилятор , в самом коннекте !?))
Извините , что достаю )
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Август 04, 2010, 17:25 »

Цитировать
Не подскажите , почему на this ругается компилятор , в самом коннекте !?))

Не имею понятия.
Записан

ArchLinux x86_64 / Win10 64 bit
Sergey
Гость
« Ответ #10 : Август 04, 2010, 17:41 »

Цитировать
Не подскажите , почему на this ругается компилятор , в самом коннекте !?))

Не имею понятия.
пишет что D:/my_project/mainwin/mainwin.cpp:25: error: invalid use of 'this' in non-member function.
Записан
Anarion
Гость
« Ответ #11 : Август 04, 2010, 19:56 »

А Вы в каком месте вызываете connect?

В частности
Код:
connect(yuorDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotProcChangeValueFromDoubleSpinBox(double)));
нужно вызывать в одном из методов класса DataPlot и после того, как будет создан объект yuorDoubleSpinBox. Например, в конструкторе этого самого DataPlot.

Или есть еще вариант, через статический метод QObject::connect();
« Последнее редактирование: Август 04, 2010, 20:12 от Anarion » Записан
Sergey
Гость
« Ответ #12 : Август 05, 2010, 10:45 »

Вроде написал что передаёт из спинбокса значение в функции . Но если значение , меняется   ф-ция не перерисовывает  линию .Подскажите как сделать чтоб ф-ция перерисовывала линию всё-таки . Знаю , что всех замучал здесь , но извините )
Заранее спасибо !
 
Код:
void DataPlot::strob(Qt::Orientation o,
    const QColor &c, double base)
{
    QSpinBox*spinBox2 = new QSpinBox;
    spinBox2->setRange(0,699);
    spinBox2->setValue(43);
    spinBox2->show();
    QwtPlotCurve *curve = new QwtPlotCurve();
  curve->setPen(QPen(Qt::blue,3));
    double x[10];
    double y[sizeof(x) / sizeof(x[0])];
    for ( uint k = 0; k < sizeof(x) / sizeof(x[0]); k++ )
    {
 double i = spinBox2->value();
        double v = i+k * 1.5;
        if ( o == Qt::Horizontal )
        {
            x[k] = v;
            y[k] = base;
        }
        else
        {
            x[k] = base;
            y[k] = v;
        }
    }
    curve->setData(x, y, sizeof(x) / sizeof(x[0]));
    curve->attach(this);
}
« Последнее редактирование: Август 05, 2010, 16:33 от Sergey » Записан
Sergey
Гость
« Ответ #13 : Август 17, 2010, 11:22 »

Появились новые вопросы с теми же спинбоксами , помогите если сможите .

Первый вопрос заключается , в том чтоб пользователь мог не только единицы менять , но и десятки в самом спинбоксе .... подскажите как это сделать !

Второй вопрос заключается  , посоветуйте как сделать лучше мне надо чтоб спинбокс лежал на картинке ...подскажите алгоритм ..как это сделать ..

Заранее спасибо за помощь ! ))
Записан
Anarion
Гость
« Ответ #14 : Август 17, 2010, 13:44 »

1) Используй не QSpinBox, а QDoubleSpinBox. Там есть все необходимые свойства: количество цифр после запятой, минимальное/ максимальное значения, а также шаг.

2) Если я правильно понял, требуется, чтобы числа отображались на каком-то фоне. Тогда можно так:
Код:
  QPalette pal = ui->doubleSpinBox->palette(); //создание палитры копированием со спин бокса
 QPixmap pix(":/image/pix.png"); //открытие изображения, в данном случае из файла ресурсов, но можешь с диска
 pal.setBrush(QPalette::Base,QBrush(pix)); //установка роли в качестве роли Base изображения (роль Background почему-то не работает)
 ui->doubleSpinBox->setPalette(pal);//установка спин боксу измененной палитры
« Последнее редактирование: Август 17, 2010, 14:03 от Anarion » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 23.