Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sergey от Август 03, 2010, 12:08



Название: Как связать переменную с спинбоксом !
Отправлено: 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);
}
Помогите пожалуйста.
Заранее благодарен


Название: Re: Как связать переменную с спинбоксом !
Отправлено: kuzulis от Август 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)





Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 03, 2010, 15:24
я новичок , не совсем понял , что в данном контексте this ,потому что компилятор на него ругается)
спасибо , что помогаете)


Название: Re: Как связать переменную с спинбоксом !
Отправлено: kuzulis от Август 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]



Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 03, 2010, 15:53
чтоб вы правильно понимали insertCurve вызывает линию , которую пользователь должен передвигать благодаря изменениям в спинбоксе  )
 да , я знаю , что странные вопросы , ну что делать !) я написал в теме Вопросы новичков)  получается , если вам не сложно покажите как реализовать первый вариант .:)

[offtop]
просто перед ними , не так стыдно как перед своими , но пока только вы мне помогаете , за что вам огромное спасибо ))  :)
[/offtop]


Название: Re: Как связать переменную с спинбоксом !
Отправлено: m_ax от Август 03, 2010, 23:58
Всё решается гораздо проще )

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

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



Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 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 варианта ... и я написал внизу , что должно получится , если есть вопросы ...спрашивайте )оч надо это сделать )


Название: Re: Как связать переменную с спинбоксом !
Отправлено: kuzulis от Август 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)));

как то так.



Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 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 ругается компилятор , в самом коннекте !?))
Извините , что достаю )


Название: Re: Как связать переменную с спинбоксом !
Отправлено: kuzulis от Август 04, 2010, 17:25
Цитировать
Не подскажите , почему на this ругается компилятор , в самом коннекте !?))

Не имею понятия.


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 04, 2010, 17:41
Цитировать
Не подскажите , почему на this ругается компилятор , в самом коннекте !?))

Не имею понятия.
пишет что D:/my_project/mainwin/mainwin.cpp:25: error: invalid use of 'this' in non-member function.


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Anarion от Август 04, 2010, 19:56
А Вы в каком месте вызываете connect?

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

Или есть еще вариант, через статический метод QObject::connect();


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 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);
}


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 17, 2010, 11:22
Появились новые вопросы с теми же спинбоксами , помогите если сможите .

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

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

Заранее спасибо за помощь ! ))


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Anarion от Август 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);//установка спин боксу измененной палитры


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 17, 2010, 15:07


2) Если я правильно понял, требуется, чтобы числа отображались на каком-то фоне. Тогда можно так:
Код:
  QPalette pal = ui->doubleSpinBox->palette(); //создание палитры копированием со спин бокса
 QPixmap pix(":/image/pix.png"); //открытие изображения, в данном случае из файла ресурсов, но можешь с диска
 pal.setBrush(QPalette::Base,QBrush(pix)); //установка роли в качестве роли Base изображения (роль Background почему-то не работает)
 ui->doubleSpinBox->setPalette(pal);//установка спин боксу измененной палитры

[/quote]ну не обязательно только цифры весь спин бокс может наход на каком то рисунке .... ну я думаю ваш кусок кода можно использовать и для всего спин бокса ... правильно ? ))


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Anarion от Август 17, 2010, 15:32
Будет закрашиваться все поле для ввода цифр, т.е. весь эдит, а не только под цифрами.
По такому принципу можешь установить палитру для виджета, на котором находится спинбокс. На счет прозрачности, правда, не знаю)


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 18, 2010, 11:05
Возник вопрос с шагом мне надо сделать чтоб пользователь , мог менять и единицы  и десятки .... а так я могу выставить только один шаг и всё ) не знаете как это поменять !? )


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Anarion от Август 18, 2010, 11:29
Первое, что приходит в голову:
1) создай QLineEdit, вставь туда QDoubleValidator и используй это поле для того, чтобы пользователь сам мог ввести шаг. Потом либо сделай кнопку "Применить", либо по завершению редактирования лайн эдита устанавливай введенное значение в качестве шага для спинбокса.
2) создай QComboBox и туда забей в строчном формате числа, например:
Код:
...
1
0.1
0.01
...
По сигналу типа currentItemChanged также устанавливай выбранное значение в качестве шага для спинбокска. Только надо будет либо преобразовать строку в double, либо делай список даблов и выбирай оттуда значение по текущему индексу в комбобоксе.


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 19, 2010, 12:47
а можно сделать чтоб спинбокс находилс на QLabel ?


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Anarion от Август 19, 2010, 13:50
В принципе можно методом
Код:
QDoubleSpinBox::setParent(QWidget*/*тут укажи свой QLabel*/)
, но получишь проблемы с лайаутами и размерами. А с какой целью это нужно, разрешите полюбопытствовать?)


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 19, 2010, 14:03
В принципе можно методом
Код:
QDoubleSpinBox::setParent(QWidget*/*тут укажи свой QLabel*/)
, но получишь проблемы с лайаутами и размерами. А с какой целью это нужно, разрешите полюбопытствовать?)
  Мне надо чтобы было видно когда кнопка активирована, а когда нет. Я добавил рисунок на  QLabel , а потом на него хочу спинбокс .  И ещё это будет довольно эстетично .Если есть ещё вопросы пишите ....рад общению ) тем более вы мне оч помогли ..и если не надоел то будете помогать )


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Anarion от Август 19, 2010, 14:20
Если хочешь отображать сам спинбокс именно на каком-то фоне, лучше(по-моему) использовать не QLabel, а QFrame. В него спокойно добавляется лайаут и все красиво выравнивается. Фон туда ставится тем же способом, но пара отличий: надо установить для фрейма setAutoFillBackground(true), и указывать роль Background в методе pal.setBrush(QPalette::Background,QBrush(pix));

Идею с кнопкой воображение не представляет :( Не понял, что хочешь)
P.S.: На счет QFrame:
1) Если делаешь в дизайнере, то
1.1 Добавляешь куда надо QFrame
1.2 Перетаскиваешь в него QDoubleSpinBox
1.3 Тыкаешь QFrame и устанавливаешь там нужный лайаут.

2) Если делаешь вручную, то нечто типа:
Код
C++ (Qt)
QFrame *frame = new QFrame(this);
frame->setLayout(new QHBoxLayout());
frame->layout()->addWidget(doubleSpinBox);


Название: Re: Как связать переменную с спинбоксом !
Отправлено: Sergey от Август 19, 2010, 14:29
спасибо ... может вы напишите в личные сообщении вашу аську .... и я покажу ващему воображению что я хочу! )