Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Июль 29, 2014, 13:43



Название: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 13:43
Помогите понять почему не отображается крайне левое значение шкалы
Вот код
Код
C++ (Qt)
MyWidget::MyWidget(QWidget *parent) :
   QWidget(parent)
{
   d_thermo = new QwtThermo(this);
   d_thermo->setOrientation(Qt::Horizontal);
   d_thermo->setScalePosition(QwtThermo::LeadingScale);
 
   double min = 1e-10;
   double max = 1e-8;
 
   QwtLinearColorMap *colorMap = new QwtLinearColorMap();
   colorMap->setMode(QwtLinearColorMap::FixedColors);
   colorMap->addColorStop(0.0,QColor("green"));
   colorMap->addColorStop((0.8*max)/(max-min),QColor("yellow"));
   colorMap->addColorStop((0.98*max)/(max-min),QColor("red"));
   d_thermo->setColorMap(colorMap);
 
   d_thermo->setScaleEngine(new QwtLinearScaleEngine);
 
   d_thermo->setScaleMaxMinor(5);
   d_thermo->setScaleMaxMajor(2);
   d_thermo->setScale(min,max);
   d_thermo->setValue(2.0e-7);
 
 
   d_wheel = new QwtWheel(this);
   d_wheel->setRange(-9,-4);
   d_wheel->setValue(-8);
   d_wheel->setOrientation(Qt::Horizontal);
   d_wheel->setSingleStep(1);
 
   d_label = new QLabel(this);
 
   QHBoxLayout *layout = new QHBoxLayout(this);
   layout->addWidget(d_thermo);
   layout->addWidget(d_wheel);
   layout->addWidget(d_label);
 
   setNum(d_wheel->value());
 
   connect(d_wheel,SIGNAL(valueChanged(double)),this,SLOT(setNum(double)));
   connect(d_wheel,SIGNAL(valueChanged(double)),this,SLOT(setScale(double)));
}
 
MyWidget::~MyWidget()
{
}
 
void MyWidget::setNum(double num)
{
   QString text;
   text.setNum(num, 'f', 2);
   d_label->setText(text);
}
 
void MyWidget::setScale(double value)
{
   qDebug()<<value;
 
   double min = pow(10,value-2);
   double max = pow(10,value);
 
   d_thermo->setScaleEngine(new QwtLinearScaleEngine);
   d_thermo->setScale(pow(10,value-2),pow(10,value));
 
   QwtLinearColorMap *colorMap = new QwtLinearColorMap();
   colorMap->setMode(QwtLinearColorMap::FixedColors);
   colorMap->addColorStop(0.0,QColor("green"));
   colorMap->addColorStop((0.8*max)/(max-min),QColor("yellow"));
   colorMap->addColorStop((0.98*max)/(max-min),QColor("red"));
   d_thermo->setColorMap(colorMap);
}
 
 


Название: Re: QWT(QwtThermo)
Отправлено: vizir.vs от Июль 29, 2014, 15:00
А если так написать?
Код:
d_thermo->setScaleMaxMajor(3);



Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 15:02
нет  :-\


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 15:04
А если так написать?
Код:
d_thermo->setScaleMaxMajor(3);
не сработает.
предлагаю заменить d_thermo->setScale(min,max) на d_thermo->setScale(0,max)


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 15:10
но у меня до нуля минимальное значение не доходит,
оно может быть очень маленьким, но только не нулем

В слоте setScale при прокрутке wheel устанавливается новый диапазон шкалы


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 15:10
d_thermo->setScaleMaxMajor(100)
тоже поможет. только эффект плохой...
мне кажется, что это особенности либы


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 15:12
 ??? да вы так уверены


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 15:15
d_thermo->setScaleMaxMajor(100)
тоже поможет. только эффект плохой...
мне кажется, что это особенности либы

Да действительно помогло.
Только такой вариант меня не устраивает :(


Название: Re: QWT(QwtThermo)
Отправлено: vizir.vs от Июль 29, 2014, 15:17
а попробуй через
Код:
QwtLinearScaleEngine->divedScale


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 15:25
и что это даст?


Название: Re: QWT(QwtThermo)
Отправлено: vizir.vs от Июль 29, 2014, 15:37
с помощью QwtScaleDiv можно расставить подписи и метки на оси. А QwtLinearScaleEngine->divedScale позволит сделать это автоматически.


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 15:39
Да походу действительно это особенности либы.
Поменял диапазон шкалы 0 до 100 и все норм.
И как от этого избавится???


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 15:41
с помощью QwtScaleDiv можно расставить подписи и метки на оси. А QwtLinearScaleEngine->divedScale позволит сделать это автоматически.

Сделал это, но не помогло


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 15:52
Да походу действительно это особенности либы.
Поменял диапазон шкалы 0 до 100 и все норм.
И как от этого избавится???
Я скажу больше.
Вы можете поставить диапазон 1-100. Получите тот же эффект. Просто либа пытается округлить значения на шкале, соответственно, минимальное круглое значение (0) лежит вне шкалы... Даже так называемый тик отсутствует в начале шкалы
Советую почитать про void QwtThermo::setScaleDraw ( QwtScaleDraw * scaleDraw ), правда, я с этим не разбирался


Название: Re: QWT(QwtThermo)
Отправлено: vizir.vs от Июль 29, 2014, 15:52
А если без QwtLinearScaleEngine->divedScale, а напрямую создать
Код:
QwtScaleDiv::QwtScaleDiv	(	double 	lowerBound,
double upperBound,
const QList< double > & minorTicks,
const QList< double > & mediumTicks,
const QList< double > & majorTicks
)
По-идеи он уже здесь ни куда не денется.


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 16:04
Да походу действительно это особенности либы.
Поменял диапазон шкалы 0 до 100 и все норм.
И как от этого избавится???
Я скажу больше.
Вы можете поставить диапазон 1-100. Получите тот же эффект. Просто либа пытается округлить значения на шкале, соответственно, минимальное круглое значение (0) лежит вне шкалы... Даже так называемый тик отсутствует в начале шкалы
Советую почитать про void QwtThermo::setScaleDraw ( QwtScaleDraw * scaleDraw ), правда, я с этим не разбирался

М-да интересно,
но в примерах есть интересный вариант
и там шкала идет от 10-1000(но правда она логарифмическая )


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 16:38
Значит выход один: делать логарифмическую шкалу  :D Шучу

Base class for scale engines.

A scale engine tries to find "reasonable" ranges and step sizes for scales.

The layout of the scale can be varied with setAttribute().

Qwt offers implementations for logarithmic and linear scales.

Но, у меня неуспешно удалось поиграть с атрибутами.


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 16:48
Мне никак не понять, что такое reference... относительно неё можно построить симметричную шкалу, либо шкалу, включающую это значение.

Вы не хотите использовать 0 в минимуме, потому что будет выводиться часть лишнего colorMap?


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 16:54
Вы не хотите использовать 0 в минимуме, потому что будет выводиться часть лишнего colorMap?

нет не хочу


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 16:56
Значит выход один: делать логарифмическую шкалу  :D Шучу

Base class for scale engines.

A scale engine tries to find "reasonable" ranges and step sizes for scales.

The layout of the scale can be varied with setAttribute().

Qwt offers implementations for logarithmic and linear scales.

Но, у меня не успешно удалось поиграть с атрибутами.

Я так и не понял что вы предлагайте?
Использовать
Код:
QwtLinearScaleEngine::setAtribute


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 17:01
я предлагаю поиграть с атрибутом IncludeReference.
Я так понял, что если задать этот референс 0, то он будет включен в шкалу, а сам ColorMap смещен.

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


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 17:06
А можете привести пример кода плз :)


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 17:16
А можете привести пример кода плз :)
К сожалению, я не разобрался, как пользоваться атрибутами. Мне удалось только инвертировать направление шкалы.
Возможно, я ошибаюсь насчет атрибутов.


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 29, 2014, 17:20
пытался сделать так
Код
C++ (Qt)
QwtLinearScaleEngine *scale = new QwtLinearScaleEngine;
scale->setAttribute(QwtLinearScaleEngine::IncludeReference);
scale->setReference(min);
...
 

но, что не получилось
или я что-тол тоже не понял

а пример кода с инвертированием шкалы можете показать...


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 29, 2014, 17:35
пытался сделать так
Код
C++ (Qt)
QwtLinearScaleEngine *scale = new QwtLinearScaleEngine;
scale->setAttribute(QwtLinearScaleEngine::IncludeReference);
scale->setReference(min);
...
 

но, что не получилось
или я что-тол тоже не понял

а пример кода с инвертированием шкалы можете показать...
Я примерно то же делал. И 0 в параметр передавал - результата не было.
Код сегодня уже показать не смогу, так как уже далеко от компьютера, но, было что-то такое: scale->setAttribute(QwtLinearScaleEngine::Inverted);
Только задавать нужно до присвоения движка.


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 30, 2014, 11:01
Пытался и инвертировать и 0 передавать ничего не получилось
Не могу разобраться почему
Код
C++ (Qt)
   d_thermo = new QwtThermo(this);
   d_thermo->setOrientation(Qt::Horizontal);
   d_thermo->setScalePosition(QwtThermo::LeadingScale);
 
   double min = 1e-10;
   double max = 1e-8;
 
   QwtLinearColorMap *colorMap = new QwtLinearColorMap();
   colorMap->setMode(QwtLinearColorMap::FixedColors);
   colorMap->addColorStop(0.0,QColor("green"));
   colorMap->addColorStop((0.8*max)/(max-min),QColor("yellow"));
   colorMap->addColorStop((0.98*max)/(max-min),QColor("red"));
   d_thermo->setColorMap(colorMap);
 
   QwtLinearScaleEngine *scale = new QwtLinearScaleEngine;
 
   scale->setAttribute(QwtLinearScaleEngine::IncludeReference);
   scale->setAttribute(QwtLinearScaleEngine::Inverted);
   scale->setReference(0.0);
 
   d_thermo->setScaleEngine(scale);//d_thermo->setScaleEngine(new QwtLinearScaleEngine);
 
   d_thermo->setScaleMaxMinor(5);
   d_thermo->setScaleMaxMajor(2);
   d_thermo->setScale(min,max);
 
   d_thermo->setValue(start_value);
 
   d_wheel = new QwtWheel(this);
   d_wheel->setRange(-11,-4);
   d_wheel->setValue(-8);
   d_wheel->setOrientation(Qt::Horizontal);
   d_wheel->setSingleStep(1);
 
   d_label = new QLabel(this);
 
   setNum(d_wheel->value());
 
   connect(d_wheel,SIGNAL(valueChanged(double)),this,SLOT(setNum(double)));
   connect(d_wheel,SIGNAL(valueChanged(double)),this,SLOT(setScale(double)));
 
   QHBoxLayout *layout = new QHBoxLayout(this);
   layout->addWidget(d_thermo);
   layout->addWidget(d_wheel);
   layout->addWidget(d_label);
 


Название: Re: QWT(QwtThermo)
Отправлено: __Heaven__ от Июль 30, 2014, 12:48
Кажется, я наврал. У меня тоже не удается инвертировать. Видимо, вчера мне показалось, что я это сделал.


Название: Re: QWT(QwtThermo)
Отправлено: demaker от Июль 30, 2014, 13:24
Т.е я так понимаю не реально сделать так - чтобы минимальное значение по шкале было не ноль ??? :-\
Неужели нет свойств компонентов, чтобы можно было модернизировать шкалу?