crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Дополнительный виджет, Плоттер
++Norton++
  опции профиля:
сообщение 4.3.2009, 23:38
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Столкнулся с такой проблемой, нужно написать программу, которая будет строить определенный график, но в Qt не нашел виджета-плоттера. :(
Подскажите пожалуйста, есть ли какая-нибудь возможность решить эту проблему? Как отобразить график? Может есть какие-нибудь дополнительные виджеты?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
++Norton++
  опции профиля:
сообщение 7.3.2009, 11:02
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


И всетаки, как же строить графики? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 7.3.2009, 13:11
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(++Norton++ @ 7.3.2009, 11:02) *
И всетаки, как же строить графики? :)

Сегодня вечером. Впринципе, уже практически все есть. Вечером покажу!

Вот сделал масштабирование. И нажатие на некоторые кнопки:
+ - масштаб +
- - масштаб -
ALT+X - выход
ALT+Enter - показ на весь экран (и обратно).
class QPaintEvent;
class QPainter;
class QRubberBand;
class QKeyEvent;
class QResizeEvent;
class QCloseEvent;
class QShowEvent;
class QWheelEvent;
class QMouseEvent;

/// Виджет, где будет отрисовываться график
class GraphicWidget: public QWidget, public Ui::GraphicWidgetClass
{
    Q_OBJECT

private:
    PlotSettings settings;        ///< настройка для различных масштабов
    QRubberBand* rubber;        ///< "резиновая лента"
    bool rubberBandIsShown;        ///< флажок попадания курсора в "резиновую ленту"
    QPoint origin;                ///< начальные координаты выделяемой области

private:
    void drawGrid(QPainter *painter);

protected:
    void paintEvent(QPaintEvent* events);
    void keyPressEvent(QKeyEvent* events);
    void wheelEvent(QWheelEvent* events);
    void mousePressEvent(QMouseEvent* events);
    void mouseMoveEvent(QMouseEvent* events);
    void mouseReleaseEvent(QMouseEvent* events);
    void resizeEvent(QResizeEvent* events) { QWidget::resizeEvent(events); update(); }
    void closeEvent(QCloseEvent* events) { QWidget::closeEvent(events); }
    void showEvent(QShowEvent* events) { QWidget::showEvent(events); }

public:
    GraphicWidget(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~GraphicWidget();
    void setPlotSettings(const PlotSettings& sts) { settings = sts; settings.adjust(); update(); }
    void zoom(double delta) { settings.scale(delta, delta); settings.adjust(); update(); }
};


Source
#include <QRubberBand>
#include <QKeyEvent>
#include <QWheelEvent>
#include <QMouseEvent>


/// Отрисовка графика
void GraphicWidget::paintEvent(QPaintEvent* events)
{
    QPainter painter(this);
    drawGrid(&painter);

    QWidget::paintEvent(events);
}

/// Нажатие на кнопки клавиатуры
void GraphicWidget::keyPressEvent(QKeyEvent* events)
{
    switch(events -> key())
    {
    case Qt::Key_Plus:
        zoom(-1.0);
    break;
    case Qt::Key_Minus:
        zoom(1.0);
    break;
    case Qt::Key_Left:
        settings.scroll(-1.0, 0.0);
        update();
    break;
    case Qt::Key_Right:
        settings.scroll(1.0, 0.0);
        update();
    break;
    case Qt::Key_Up:
        settings.scroll(0.0, 1.0);
        update();
    break;
    case Qt::Key_Down:
        settings.scroll(0.0, -1.0);
        update();
    break;
    case Qt::Key_X:
        if(events -> modifiers() & Qt::ALT) close();
    break;
    case Qt::Key_Return:
        if(events -> modifiers() & Qt::ALT)
        {
            if(!isMaximized()) showMaximized();
            else showNormal();
        }
    break;
    default:
        QWidget::keyPressEvent(events);
    }
}

/// Изменение масштаба при движении колесика
void GraphicWidget::wheelEvent(QWheelEvent* events)
{
    int numDegrees = events -> delta() / 8;
    double numTicks = numDegrees / 15.0;
    
    zoom(numTicks);
    update();
}

/// Нажатие на кнопку - изменение масштаба
void GraphicWidget::mousePressEvent(QMouseEvent* events)
{
    QWidget::mousePressEvent(events);

    QRect r;
    switch(events -> button())
    {
    case Qt::LeftButton:                ///< если нажата левая кнопка мыши
        origin = events -> pos();
        rubberBandIsShown = true;
        setCursor(Qt::CrossCursor);
        r = QRect(origin, QSize());
        rubber -> setGeometry(r);
        rubber -> show();
    break;
    case Qt::RightButton:                ///< если нажата правая кнопка мыши
    break;
    default:
    break;
    }
}

/// Переопределение функции передвижения мыши
void GraphicWidget::mouseMoveEvent(QMouseEvent* events)
{
    if(rubberBandIsShown)
    {
        rubber -> setWindowOpacity(0.0);
        rubber -> setGeometry(QRect(origin, events -> pos()).normalized());
    }

    update();
}

/// Возвращение прежнего вида курсору и изменение масштаба
void GraphicWidget::mouseReleaseEvent(QMouseEvent* events)
{
    if(events -> button() == Qt::LeftButton && rubberBandIsShown)
    {
        rubberBandIsShown = false;
        unsetCursor();
        
        QRect rect = rubber -> geometry().normalized();
        if(rect.width() < 10 || rect.height() < 10)
        {
            double dx = rect.width() / settings.spanX();
            double dy = rect.height() / settings.spanY();
            settings.scroll(dx, dy);

            update();
            return;
        }
        PlotSettings prevSettings = settings;

        double dx = prevSettings.spanX() / width();
        double dy = prevSettings.spanY() / height();
        settings.minX = prevSettings.minX + dx * rect.left();
        settings.maxX = prevSettings.minX + dx * rect.right();
        settings.minY = prevSettings.maxY - dy * rect.bottom();
        settings.maxY = prevSettings.maxY - dy * rect.top();
        settings.adjust();

        rubber -> hide();
        update();
    }
}


Сообщение отредактировал AD - 7.3.2009, 14:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- ++Norton++   Дополнительный виджет   4.3.2009, 23:38
- - SABROG   Это? http://qwt.sourceforge.net/class_qwt_plot.htm...   5.3.2009, 0:04
- - AD   Цитата(++Norton++ @ 4.3.2...   5.3.2009, 0:19
- - ++Norton++   SABROG, спасибо, пробовал, скачивал, только не пол...   5.3.2009, 0:34
|- - AD   Цитата(++Norton++ @ 5.3.2...   5.3.2009, 0:35
|- - ++Norton++   Конечно, все отлично, буду ждать!   5.3.2009, 0:50
- - Litkevich Yuriy   ++Norton++, про Qwt есть отдельная тема, почитай т...   5.3.2009, 8:16
- - kwisp   Цитата(++Norton++ @ 5.3.2...   5.3.2009, 9:02
- - Kagami   Я тоже свой виджет для построения графиков делал   5.3.2009, 9:45
|- - AD   Первое. Желательно создать новый проект. Основной ...   5.3.2009, 11:52
- - ++Norton++   Спасибо, все понятно кроме некоторых деталей: 1) ...   5.3.2009, 12:21
|- - AD   Цитата(++Norton++ @ 5.3.2...   5.3.2009, 12:32
- - ++Norton++   Вопрос, конечно ламерский, но все же А как можно...   5.3.2009, 12:47
|- - AD   Пофигу где. Главное, чтобы ты смог открыть окно, а...   5.3.2009, 12:55
- - ++Norton++   Цитата(AD @ 5.3.2009, 13:55) нужная форма...   5.3.2009, 13:05
|- - AD   Обведенный в овальчик!   5.3.2009, 13:19
- - ++Norton++   Огромное спасибо! Отлично, все получилось...   6.3.2009, 11:15
- - ++Norton++   И всетаки, как же строить графики?   7.3.2009, 11:02
|- - AD   Цитата(++Norton++ @ 7.3.2...   7.3.2009, 13:11
|- - AD   Добавить в класс 3 функции: private: void dra...   7.3.2009, 14:00
- - Kagami   Напоминает пример из книжки Жасмин Бланшет   7.3.2009, 14:26
|- - AD   Цитата(Kagami @ 7.3.2009, 14:26) Напомина...   7.3.2009, 14:51
- - Litkevich Yuriy   AD, Оборачивай длинные портянки кода в тэг экспанд   7.3.2009, 14:48
- - ++Norton++   Вроде все сделал так, но при компиляции выдается о...   7.3.2009, 16:15
|- - AD   Цитата(++Norton++ @ 7.3.2...   7.3.2009, 16:20
- - ++Norton++   Огромнейшее спасибо! Теперь все отлично работа...   7.3.2009, 20:40
- - ++Norton++   Да, хотел только еще один вопрос задать... Когда н...   7.3.2009, 22:38
|- - AD   ЦитатаДа, хотел только еще один вопрос задать... К...   7.3.2009, 22:56
|- - BRE   Цитата(++Norton++ @ 7.3.2...   7.3.2009, 23:08
|- - AD   GraphicWidget::GraphicWidget(QWidget *...   7.3.2009, 23:15
- - ++Norton++   Спасибо! Теперь все работает! Только лента...   8.3.2009, 0:46
|- - AD   Цитата(++Norton++ @ 8.3.2...   10.3.2009, 12:14
|- - AD   Цитата(++Norton++ @ 8.3.2...   6.11.2009, 15:49
- - asdf   а подскажите по этому примеру в чём косяк. при доб...   24.9.2009, 11:17
|- - AD   Цитата(asdf @ 24.9.2009, 12:17) а подскаж...   24.9.2009, 18:06
|- - asdf   Цитата(AD @ 24.9.2009, 18:06) Прошу приве...   24.9.2009, 23:10
- - ufna   обычно такая хрень идет по двум причинам: 1. чет н...   24.9.2009, 23:18
|- - AD   Думаю, что ребилд должен помочь! Цитата2. с...   24.9.2009, 23:23
|- - AD   Ну... решил выложить еще раз решение. ПОЛНОСТЬЮ...   27.9.2009, 15:13
- - Litkevich Yuriy   AD, чёто с русскими коментариями бяка какая-то   27.9.2009, 17:01
|- - AD   Цитата(Litkevich Yuriy @ 27.9.2009, 18:01...   27.9.2009, 17:10
- - Гость   Уважаемые, поясните пожалуйста что за файл подключ...   24.12.2009, 21:20
|- - AD   Цитата(Гость @ 24.12.2009, 21:20) Уважаем...   24.12.2009, 22:33
|- - Fitz   Цитата(Гость @ 24.12.2009, 21:20) Уважаем...   2.12.2010, 14:26
- - Litkevich Yuriy   Цитата(Гость_Гость_* @ 25.12.2009, 0:20) ...   24.12.2009, 22:35
- - AlmNeft   AD, ++Norton++, выложите пожалуйста папку с прогой...   17.4.2010, 22:43
|- - AD   Цитата(AlmNeft @ 17.4.2010, 23:43) AD, ++...   17.4.2010, 23:28
- - Fitz   /// Инициализация координат - преобразование из ко...   4.2.2011, 15:02


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 21:12