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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: рисование с QGraphicsScene + скорость + прошу совет  (Прочитано 2879 раз)
_Vitaliy_
Гость
« : Август 30, 2011, 17:57 »

Доброго времени суток.
Прошу, как говорится, совета "бывалых".
Правильно ли я делаю что:
1. отрисовка происходит в моделе?
2. оптимально ли я это делаю? (необходимо выводить порядка 20 графиков по несколько тыс. значений).

И опять вопрос по поводу ограничения перемещения по оси ОХ, знаю что нужно делать через itemChange
   но скудные знания пока не позволяют реализовать (взял пример, подставил но не работает...)

вызов окна отрисовки в MainWindow:
Код:
void MainWindow::viewObrabotka()
{
    obrabotka *pobrabotka = new obrabotka(this);
    pobrabotka->setAttribute(Qt::WA_DeleteOnClose);
    pobrabotka->setWindowTitle("Grafiki zavisimostey parametrov ot vremeni");
    pobrabotka->setModel(model);
    pobrabotka->resize(600, 400); 
}
obrabotka.h
Код:
#ifndef OBRABOTKA_H
#define OBRABOTKA_H

class QStandardItemModel;
class QGraphicsItem;
class DiagramScene;
class QVariant;
#include <QGraphicsScene>
#include <QtGui/QDialog>
#include <QMainWindow>

#include <QGraphicsPixmapItem>
#include <QList>

QT_BEGIN_NAMESPACE
class QPixmap;
class QGraphicsItem;
class QGraphicsScene;
class QTextEdit;
class QGraphicsSceneMouseEvent;
class QMenu;
class QGraphicsSceneContextMenuEvent;
class QPainter;
class QStyleOptionGraphicsItem;
class QWidget;
class QPolygonF;
QT_END_NAMESPACE

class obrabotka : public QMainWindow
{
        Q_OBJECT
// Q_DISABLE_COPY(obrabotka)
public:
        explicit obrabotka(QWidget *parent = 0);
        virtual ~obrabotka();

    void itemChanged(QGraphicsItem* item);///
    void addAdorner(QGraphicsItem* item);

    void setModel(QStandardItemModel *model);

private:
        QStandardItemModel *m_model;
        void createActions();
        void createMenus();
        void createToolBars();

        QGraphicsScene* scene;///
        //MyAdorner* m_adorner;

        void init_scene();

protected:
    //void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
    //QVariant itemChange(GraphicsItemChange change, const QVariant &value);

private slots:
    // void itemSelected(QGraphicsItem *item);

};

class MyAdorner : public QGraphicsItem
{
public:
    MyAdorner(QGraphicsItem* adorned, obrabotka* obra);
    virtual ~MyAdorner();
    QGraphicsItem* adorned() { return m_adorned; }
    enum { Type = UserType + 100 };
    virtual int type() const { return Type; }
    virtual QRectF boundingRect() const;
    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
    void itemChanged(QGraphicsItem* item);

private:
    QGraphicsItem*  m_adorned;
    obrabotka* m_obra;
};


#endif // OBRABOTKA_H

obrabotka.cpp
Код:
#include <QtGui/QStandardItemModel>
#include <QtGui/QVBoxLayout>

#include "obrabotka.h"
#include "mainwindow.h"

#include <QtDebug>
#include <math.h>

class QToolBox;
class QToolBar;
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>

#include <QGraphicsView>


obrabotka::obrabotka(QWidget *parent)
                :QMainWindow(parent)
{
createActions();
createToolBars();
createMenus();
}

obrabotka::~obrabotka()
{
}

void obrabotka::createActions()
{
    //
}

void obrabotka::createToolBars()
{
    //
}

void obrabotka::createMenus()
{
    //
}


void obrabotka::setModel(QStandardItemModel *model)
{
m_model = model;

        QList<double> x0, x1, x2, x3, x4;
        int Size = m_model->rowCount();
        double X0[Size], X1[Size], X2[Size], X3[Size], X4[Size];


        QGraphicsView *view = new QGraphicsView();
        QGraphicsScene *scene = new QGraphicsScene(-50, 0, Size + 50, 900, this); // razmer vidjeta
        view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
        view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
        view->setRenderHint(QPainter::Antialiasing, true);

        for (int i = 0; i < m_model->rowCount(); i++)
        {
                x0.append(m_model->item(i, 0)->text().toDouble());
                x3.append(m_model->item(i, 2)->text().toDouble());
                x4.append(m_model->item(i, 4)->text().toDouble());
}

        QGraphicsTextItem* p3TextItem =
        scene->addText("X,m");
        p3TextItem->setFlags(QGraphicsItem::ItemIsMovable);
        p3TextItem->setPos(0,100);

        QGraphicsItemGroup *group = new QGraphicsItemGroup;
        group->addToGroup(p3TextItem);
        group->setFlags(QGraphicsItem::ItemIsMovable);

        QGraphicsItemGroup *group4 = new QGraphicsItemGroup;
        group4->setFlags(QGraphicsItem::ItemIsMovable);

        for (int i = 1; i < m_model->rowCount()-1; i++)
        {
                X0[i] = i;
                X3[i] = x3[i];
                X4[i] = x4[i];
                //qDebug() << X0[i] << X3[i];
                QGraphicsLineItem* p3LineItem =
                scene->addLine(QLineF(X0[i], 700 - X3[i], X0[i-1], 700 - X3[i-1]), QPen(Qt::green, 2));
                p3LineItem->setParentItem(p3TextItem); // naznachenie roditelya

                QGraphicsLineItem* p4LineItem =
                scene->addLine(QLineF(X0[i], 700 - X4[i], X0[i-1], 700 - X4[i-1]), QPen(Qt::blue, 2));
                group4->addToGroup(p4LineItem);
        }


        scene->addItem(group);
        scene->addItem(group4);

        view->setScene(scene);
        view->resize(800, 600);
        view->show();

}


QVariant MyAdorner::itemChange(GraphicsItemChange change, const QVariant &value)
//QVariant obrabotka::itemChange(GraphicsItemChange change, const QVariant &value)
{
     if (change == ItemPositionChange && scene()) {
         // value is the new position.
         QPointF newPos = value.toPointF();
         newPos.setX(x());
         QRectF rect = scene()->sceneRect();
         if (!rect.contains(newPos)) {
             // Keep the item inside the scene rect.
             newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
             newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));

         } return newPos;
     }

     return QGraphicsItem::itemChange(change, value);
 }
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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