Russian Qt Forum

Qt => Вопросы новичков => Тема начата: karpenko1989 от Январь 23, 2012, 15:35



Название: QwtScaleWidget
Отправлено: karpenko1989 от Январь 23, 2012, 15:35
Добрый день. Требуется нарисовать шкалу
(http://s2.ipicture.ru/uploads/20120119/NlN5CSrl.jpg)
В библиотека есть класс для их отображения - QwtScaleWidget. Но у меня это сделать никак не получается.
Хотелось бы увидеть код для подключения данного виджета.


Название: Re: QwtScaleWidget
Отправлено: popper от Январь 23, 2012, 19:00
А на каком этапе проблема? Приложение компилируется?
Посмотри в примерах использование. Ошибка также может быть в части размещения виджета в компоновщике


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 24, 2012, 07:20
Создаю виджет
Код:
    
myScale = new QwtScaleWidget;
myScaleDraw = new QwtScaleDraw;
myScale->setScaleDraw(myScaleDraw);
На форме появляется просто вертикальная линия. Но я никак немогу найти в документации, с помощью каких методов задать нижний и верхний предел.


Название: Re: QwtScaleWidget
Отправлено: alexman от Январь 24, 2012, 11:18
void QwtPlot::setAxisScale(int axisId, double min, double max, double step = 0)
ну а там в исходниках глянь...


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 24, 2012, 12:20
setAxisScale задает шкалу, привязанную к графику, а мне нужно нарисовать только отдельную шкалу, без графика.


Название: Re: QwtScaleWidget
Отправлено: alexman от Январь 24, 2012, 12:46
void QwtPlot::setAxisScale(int axisId, double min, double max, double step = 0) - задает диапазон и шаг для определенной шкалы график.

Цитировать
ну а там в исходниках глянь...
посмотри что внутри происходит, так как QwtPlot для шкал использует QwtScaleWidget...


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 25, 2012, 08:25
Хорошо, спасибо, я попытаюсь разобраться с этим.

Тогда, раз уж речь в теме идет про Qwt, попробую задать еще один вопрос.
Возможно ли средствами библиотеки Qwt отобразить на одном графике несколько кривых (до 9) с разным масштабом? Выглядеть это должно примерно так:
(http://s1.ipicture.ru/uploads/20120125/Hy02EKnn.jpg)


Название: Re: QwtScaleWidget
Отправлено: popper от Январь 25, 2012, 11:19
Вроде бы можно установить две разные шкалы для левой и правой осей графика.
Для каждой кривой можно установить левую или правую шкалу методом
Код:
void QwtPlotItem::setYAxis (int axis); 
// axis = QwtPlot::yLeft or QwtPlot::yRight


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 25, 2012, 12:25
Вроде бы можно установить две разные шкалы для левой и правой осей графика.
Для каждой кривой можно установить левую или правую шкалу методом
Код:
void QwtPlotItem::setYAxis (int axis); 
// axis = QwtPlot::yLeft or QwtPlot::yRight


К сожалению так сделать не получается, ось Y рисуется только одна


Название: Re: QwtScaleWidget
Отправлено: alexman от Январь 25, 2012, 14:22
Можно рисовать шкалы как элемент сцены...


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 25, 2012, 15:44
Можно рисовать шкалы как элемент сцены...
а можно поподробнее?, я с qt только начал потихоньку разбираться


Название: Re: QwtScaleWidget
Отправлено: alexman от Январь 25, 2012, 16:39
1. Ну делаешь наследника от QwtPlotItem и рисуешь шкалу. В результате на сцене будет две шкалы (наследники от QwtPlotItem) и два графика.
2. Можно просто в лайаут добавить вертикальный QwtScaleWidget (*) | QwtPlot. Шкала из QwtPlot будет автоматом забиваться нужными данными, а содержимым (*) сам будешь управлять. Этот способ, наверное, проще будет чем 1.


Название: Re: QwtScaleWidget
Отправлено: iroln от Январь 25, 2012, 19:15
Хорошо, спасибо, я попытаюсь разобраться с этим.

Тогда, раз уж речь в теме идет про Qwt, попробую задать еще один вопрос.
Возможно ли средствами библиотеки Qwt отобразить на одном графике несколько кривых (до 9) с разным масштабом?
Зачем такие извращения то? Больше двух масштабов никто не делает (по крайней мере я ни разу не видел), поэтому для этого и нет инструментов. Если нужно отображать на одних осях графики с разным масштабом, то нужно масштабировать значения самих графиков, а в легенде писать: График --1 x 10, График 2 x 100, и т.д.


Название: Re: QwtScaleWidget
Отправлено: Белый пони от Январь 25, 2012, 22:48
Вот и Уве Ратман думает, что это извращение.
Но задачи бывают разные. Добрые люди сделали патч для более чем двух осей (в комментах пишут, что только для qwt 6.0.0) - http://sourceforge.net/tracker/?func=detail&aid=3297826&group_id=13693&atid=313693


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 26, 2012, 12:42
Вот и Уве Ратман думает, что это извращение.
Но задачи бывают разные. Добрые люди сделали патч для более чем двух осей (в комментах пишут, что только для qwt 6.0.0) - http://sourceforge.net/tracker/?func=detail&aid=3297826&group_id=13693&atid=313693
Огромное всем спасибо. Данный патч это то что мне нужно.


Название: Re: QwtScaleWidget
Отправлено: Белый пони от Январь 26, 2012, 13:36
Вот и Уве Ратман думает, что это извращение.
Но задачи бывают разные. Добрые люди сделали патч для более чем двух осей (в комментах пишут, что только для qwt 6.0.0) - http://sourceforge.net/tracker/?func=detail&aid=3297826&group_id=13693&atid=313693
Огромное всем спасибо. Данный патч это то что мне нужно.Но появился вопрос. Данный патч можно установить автоматически, или изменения нужно вносить в файлы вручную?

Я пробовал на Ubuntu 10.10 автоматически. Не получилось, я не стал разбираться и аккуратненько поправил файлы в ручную, скорее всего это не оптимальный способ:)


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 26, 2012, 14:47
Установил патч. При запуске приложения, выводится много предупреждений:
Код:
--> d_data->canvasRect.setRect(39,50,1097,560);
yLeft[0] x=0.000000 y=50.000000 w=39.000000 h=560.000000
yBottom[20] x=39.000000 y=610.000000 w=1097.000000 h=27.000000
Left 0 Valid
Left 1 INValid
Left 2 INValid
Left 3 INValid
Left 4 INValid
Left 5 INValid
Left 6 INValid
Left 7 INValid
Left 8 INValid
Left 9 INValid
Я так понимаю это из-за того, что ось Y в данный момент подключена только одна.

Создаю новую кривую, подключаю ее к графику:
Код:
curv2 = new QwtPlotCurve(QString("U2(t)"));
curv2->attach(myPlot);
Но я никак не разберусь как подключить к кривой новую ось?


Название: Re: QwtScaleWidget
Отправлено: Белый пони от Январь 26, 2012, 15:06
Установил патч. При запуске приложения, выводится много предупреждений:
Код:
--> d_data->canvasRect.setRect(39,50,1097,560);
yLeft[0] x=0.000000 y=50.000000 w=39.000000 h=560.000000
yBottom[20] x=39.000000 y=610.000000 w=1097.000000 h=27.000000
Left 0 Valid
Left 1 INValid
Left 2 INValid
Left 3 INValid
Left 4 INValid
Left 5 INValid
Left 6 INValid
Left 7 INValid
Left 8 INValid
Left 9 INValid
Я так понимаю это из-за того, что ось Y в данный момент подключена только одна.

Я так понимаю, это просто отладочная информация. Я просто закоментил в исходниках все qDebug'и, что такого не писалось.


Цитировать
Создаю новую кривую, подключаю ее к графику:
Код:
curv2 = new QwtPlotCurve(QString("U2(t)"));
curv2->attach(myPlot);
Но я никак не разберусь как подключить к кривой новую ось?

Методами QwtPlot::enableAxis и QwtCurve::setAxes .




Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 26, 2012, 15:29
Код:
ошибка: 'class QwtPlot' has no member named 'setAxes'
такого метода нет.
В установленном патче есть метод
Код:
QwtPlotItem::setAxes


Пишу так:
Код:
int xb = QwtPlot::xBottom;
int yl = QwtPlot::yLeft;
curv1->setAxes(xb,yl);
ui->myPlot->enableAxis(yl);
int xb2 = QwtPlot::xBottom;
int yl2 = QwtPlot::yLeft;
curv2->setAxes(xb2,yl2);
ui->myPlot->enableAxis(yl2);

Но ось попрежнему одна.


Название: Re: QwtScaleWidget
Отправлено: Белый пони от Январь 26, 2012, 16:17
xBottom, xTop, yLeft и yRight - это просто именованные числовые константы, соответсующие осям в оригинальном qwt.

после установки патча числовые значения, соответствующие осям будут: xBottom, xBottom+1, xBottom+2, ..., yLeft, yLeft+1, yLeft+2, ...

посмотри файл патча текстовым редктором, он как раз вносит эти изменения в qwt_plot.h :

Код:
Index: qwt_plot.h
===================================================================
--- qwt_plot.h (revision 1014)
+++ qwt_plot.h (working copy)
@@ -74,25 +74,19 @@
         READ grabProperties WRITE applyProperties )
 
 public:
-    //! \brief Axis index
-    enum Axis
-    {
-        //! Y axis left of the canvas
-        yLeft,
 
-        //! Y axis right of the canvas
-        yRight,
+    static const int axisCntBySide = 10;
+    static const int yLeft         = 0;
+    static const int yLeftMax      = yLeft      + axisCntBySide - 1;
+    static const int yRight        = yLeftMax   + 1;
+    static const int yRightMax     = yRight     + axisCntBySide - 1;
+    static const int xBottom       = yRightMax  + 1;
+    static const int xBottomMax    = xBottom    + axisCntBySide - 1;
+    static const int xTop          = xBottomMax + 1;
+    static const int xTopMax       = xTop       + axisCntBySide - 1;
+    static const int axisCnt       = xTopMax    + 1;
 
-        //! X axis below the canvas
-        xBottom,
 
-        //! X axis above the canvas
-        xTop,
-
-        //! Number of axes
-        axisCnt
-    };
-
     /*!
         Position of the legend, relative to the canvas.


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 27, 2012, 07:58
xBottom, xTop, yLeft и yRight - это просто именованные числовые константы, соответсующие осям в оригинальном qwt.

после установки патча числовые значения, соответствующие осям будут: xBottom, xBottom+1, xBottom+2, ..., yLeft, yLeft+1, yLeft+2, ...

посмотри файл патча текстовым редктором, он как раз вносит эти изменения в qwt_plot.h :

Код:
Index: qwt_plot.h
===================================================================
--- qwt_plot.h (revision 1014)
+++ qwt_plot.h (working copy)
@@ -74,25 +74,19 @@
         READ grabProperties WRITE applyProperties )
 
 public:
-    //! \brief Axis index
-    enum Axis
-    {
-        //! Y axis left of the canvas
-        yLeft,
 
-        //! Y axis right of the canvas
-        yRight,
+    static const int axisCntBySide = 10;
+    static const int yLeft         = 0;
+    static const int yLeftMax      = yLeft      + axisCntBySide - 1;
+    static const int yRight        = yLeftMax   + 1;
+    static const int yRightMax     = yRight     + axisCntBySide - 1;
+    static const int xBottom       = yRightMax  + 1;
+    static const int xBottomMax    = xBottom    + axisCntBySide - 1;
+    static const int xTop          = xBottomMax + 1;
+    static const int xTopMax       = xTop       + axisCntBySide - 1;
+    static const int axisCnt       = xTopMax    + 1;
 
-        //! X axis below the canvas
-        xBottom,
 
-        //! X axis above the canvas
-        xTop,
-
-        //! Number of axes
-        axisCnt
-    };
-
     /*!
         Position of the legend, relative to the canvas.

Огромное спасибо, все заработало. Вот только в левом верхнем угле формы появился непонятный артефакт:
(http://imglink.ru/pictures/27-01-12/7182a1ec02a328e51c34e1c51337fb63.jpg)

И последнее. Так, как оси рисуются сейчас нельзя понять какая ось к какой кривой относится. Можно ли рисовать ось Y другим цветом (так чтобы цвет ось совпадал с цветом кривой), или хотя бы изменить цвет подписи оси?


Название: Re: QwtScaleWidget
Отправлено: Белый пони от Январь 27, 2012, 10:13

Огромное спасибо, все заработало. Вот только в левом верхнем угле формы появился непонятный артефакт:
(http://imglink.ru/pictures/27-01-12/7182a1ec02a328e51c34e1c51337fb63.jpg)

И последнее. Так, как оси рисуются сейчас нельзя понять какая ось к какой кривой относится. Можно ли рисовать ось Y другим цветом (так чтобы цвет ось совпадал с цветом кривой), или хотя бы изменить цвет подписи оси?

У меня такой же артефакт был, думаю это глюк патча.

Цветные оси сделать можно, я как-то видел в инете примеры, погугли что-то типа "qwt color scale draw" .


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 27, 2012, 10:16
Спасибо за помощь.


Название: Re: QwtScaleWidget
Отправлено: karpenko1989 от Январь 30, 2012, 13:01
Добрый день, прошу оказать помощь еще по одному моменту при работе с Qwt с несколькими осями Y.

Создаю 2 кривые с разными осями
Код:
    
    curv1 = new QwtPlotCurve("Amplitude");
    curv1->setRenderHint(QwtPlotItem::RenderAntialiased);
    curv1->setPen(QPen(Qt::red));
    int xb = QwtPlot::xBottom;
    int yl = QwtPlot::yLeft;
    curv1->setAxes(xb,yl);
    myPlot->enableAxis(yl);
   curv1->attach(myPlot);
///////
   curv2 = new QwtPlotCurve("Amplitude");
   curv2->setRenderHint(QwtPlotItem::RenderAntialiased);
   curv2->setPen(QPen(Qt::green));
   int xb2 = QwtPlot::xBottom;
   int yl2 = QwtPlot::yLeft+1;
   curv2->setAxes(xb2,yl2);
   myPlot->enableAxis(yl2);
   curv2->attach(myPlot);

К ним соответственно подключаю 2 объекта стандартного класса Zoomer
Код:
    d_zoomer[0] = new Zoomer( xb, yl,
    myPlot->canvas());
    d_zoomer[0]->setRubberBand(QwtPicker::RectRubberBand);
    d_zoomer[0]->setRubberBandPen(QColor(Qt::green));
    d_zoomer[0]->setTrackerMode(QwtPicker::ActiveOnly);
    d_zoomer[0]->setTrackerPen(QColor(Qt::white));

    d_zoomer[1] = new Zoomer(QwtPlot::xTop, QwtPlot::yRight,
         myPlot->canvas());

    d_zoomer1[0] = new Zoomer( xb2, yl2,
        myPlot->canvas());
    d_zoomer1[0]->setRubberBand(QwtPicker::RectRubberBand);
    d_zoomer1[0]->setRubberBandPen(QColor(Qt::green));
    d_zoomer1[0]->setTrackerMode(QwtPicker::ActiveOnly);
    d_zoomer1[0]->setTrackerPen(QColor(Qt::white));

    d_zoomer1[1] = new Zoomer(QwtPlot::xTop, QwtPlot::yRight,
         myPlot->canvas());

При увеличении, например, участка по оси X от 0 до 1, увеличивается участок от 0 до 0.12 и.т.д
При работе с одной осью координат все увеличивается как надо.


Название: Re: QwtScaleWidget
Отправлено: Белый пони от Январь 30, 2012, 18:44
Я про зумеры не знаю, не пользщовался ни разу :( Может кто другйо подскажет...


Название: Re: QwtScaleWidget
Отправлено: iroln от Январь 30, 2012, 19:35
Предполагаю, что зуммер ничего не знает о ваших нескольких осях и масштабирует по какой-то одной. Ну это так навскидку.