crossplatform.ru

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

2 страниц V   1 2 >  
Тема закрытаНачать новую тему
> [РЕШЕНО] Вопрос по Элипсам
Tin-moon
  опции профиля:
сообщение 11.4.2010, 18:04
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 11.4.2010
Пользователь №: 1620

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




Репутация:   0  


Вот есть пример http://doc.crossplatform.ru/qt/4.3.5/graph...agramscene.html тут строят различные диаграммы. Вопрос как сюда можно добавить элементы в виде Элипсов?
После добавления:
void Shape::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *){

    painter->setPen(Qt::black);
    painter->setBrush(Qt::darkGray);
    painter->drawEllipse(-50, -50, 100, 100);
    setFlag(QGraphicsItem::ItemIsMovable, true);
    setFlag(QGraphicsItem::ItemIsSelectable, true);
}

QRectF Shape::boundingRect() const{
    qreal adjust = 2;
    return QRectF(-50 - adjust, -50 - adjust,100 + adjust, 100 + adjust);
}


Любой старый элемент отображается как этот круг.

Кто что может подсказать....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.4.2010, 18:07
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


А что за класс такой Shape?
В примере такого вроде нету
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tin-moon
  опции профиля:
сообщение 11.4.2010, 18:17
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 11.4.2010
Пользователь №: 1620

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 11.4.2010, 18:07) *
А что за класс такой Shape?
В примере такого вроде нету



Это у меня так(немного переписал):

#ifndef SHAPE_H
#define SHAPE_H

#include <QGraphicsPixmapItem>
#include <QList>
#include <QPainter>
#include <QtGui>

class Pointer;

class Shape : public QGraphicsPolygonItem{
public:
    enum {
        Type = UserType + 15
    };
    enum DiagramType {
        Conditional,
        StartEnd
    };

    Shape(DiagramType diagramType, QMenu *contextMenu, QGraphicsItem *parent = 0, QGraphicsScene *scene = 0);

    void addPointer(Pointer *pointer);
    void removePointer(Pointer *pointer);
    void removePointers();



    DiagramType diagramType() const{
        return myDiagramType;
    }

    QPolygonF polygon() const{
        return myPolygon;
    }

    //QPixmap image() const;

    int type() const{
        return Type;
    }

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

private:
    DiagramType myDiagramType;
    QPolygonF myPolygon;
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option=0, QWidget *widget=0);

    QMenu *myContextMenu;
    QList<Pointer *> pointers;
};

#endif // SHAPE_H
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.4.2010, 8:47
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(Tin-moon @ 11.4.2010, 19:04) *
Любой старый элемент отображается как этот круг.
Как я понимаю у тебя рисуется через твой класс Shape, потому и все элементы рисуются элипсами.
Для каждого элемента по идее нужен свой класс, который будет его рисовать... :)

Если же я ошибаюсь, тогда покажи весь код...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 8:56
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


вообще я как-то порывался этот пример под себя переделать. Но, к сожалению, он написан так, что его нельзя расширить новой функциональностью :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tin-moon
  опции профиля:
сообщение 12.4.2010, 9:18
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 11.4.2010
Пользователь №: 1620

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




Репутация:   0  


Цитата(ViGOur @ 12.4.2010, 8:47) *
Цитата(Tin-moon @ 11.4.2010, 19:04) *
Любой старый элемент отображается как этот круг.
Как я понимаю у тебя рисуется через твой класс Shape, потому и все элементы рисуются элипсами.
Для каждого элемента по идее нужен свой класс, который будет его рисовать... :)

Если же я ошибаюсь, тогда покажи весь код...


Переписал немного чтобы не смущал Shape

Вот test.h
#ifndef TEST_H
#define TEST_H

#include <QGraphicsPixmapItem>
#include <QList>
#include <QPainter>
#include <QtGui>

class Pointer;

class Test : public QGraphicsPolygonItem{
public:
    enum {
        Type = UserType + 15
    };
    enum DiagramType {
        Conditional,
        StartEnd
    };

    Test(DiagramType diagramType, QMenu *contextMenu, QGraphicsItem *parent = 0, QGraphicsScene *scene = 0);

    void addPointer(Pointer *pointer);
    void removePointer(Pointer *pointer);
    void removePointers();



    DiagramType diagramType() const{
        return myDiagramType;
    }

    QPolygonF polygon() const{
        return myPolygon;
    }

    //QPixmap image() const;

    int type() const{
        return Type;
    }

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

private:
    DiagramType myDiagramType;
    QPolygonF myPolygon;
    //QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option=0, QWidget *widget=0);

    QMenu *myContextMenu;
    QList<Pointer *> pointers;
};
#endif // TEST_H

Test.cpp
#include <QtGui>

#include "test.h"
#include "pointer.h"

Test::Test(DiagramType diagramType, QMenu *contextMenu,QGraphicsItem *parent, QGraphicsScene *scene)
    : QGraphicsPolygonItem(parent, scene){

    myDiagramType = diagramType;
    myContextMenu = contextMenu;


   // QPainterPath path;
    //QPainter path;
    switch (myDiagramType){
        case Conditional:
        myPolygon   << QPointF(-50, 0)
                    << QPointF(0, 50)
                    << QPointF(50, 0)
                    << QPointF(0, -50)
                   << QPointF(-50, 0);
        default:
            break;
    }

    setPolygon(myPolygon);

    setFlag(QGraphicsItem::ItemIsMovable, true);
    setFlag(QGraphicsItem::ItemIsSelectable, true);

}

void Test::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *){

    painter->setPen(Qt::black);
    painter->setBrush(Qt::darkGray);
    painter->drawEllipse(-50, -50, 100, 100);
    setFlag(QGraphicsItem::ItemIsMovable, true);
    setFlag(QGraphicsItem::ItemIsSelectable, true);

/*    QRadialGradient gradient(-3, -3, 10);
    if (option->state & QStyle::State_Sunken) {
        gradient.setCenter(3, 3);
        gradient.setFocalPoint(3, 3);
        gradient.setColorAt(1, QColor(Qt::yellow).light(120));
        gradient.setColorAt(0, QColor(Qt::darkYellow).light(120));
    }
    else {
        gradient.setColorAt(0, Qt::yellow);
        gradient.setColorAt(1, Qt::darkYellow);
    }
    painter->setBrush(gradient);
    painter->setPen(QPen(Qt::black, 0));
    painter->drawEllipse(-50, -50, 100, 100);
*/

}

//QRectF Test::boundingRect() const{
//    qreal adjust = 2;
//    return QRectF(-50 - adjust, -50 - adjust,100 + adjust, 100 + adjust);
//}

void Test::removePointer(Pointer *pointer){  
    int index = pointers.indexOf(pointer);
    if (index != -1)
        pointers.removeAt(index);
}

void Test::removePointers(){              
    foreach (Pointer *pointer, pointers) {
        pointer->startItem()->removePointer(pointer);
        pointer->endItem()->removePointer(pointer);
        scene()->removeItem(pointer);
        delete pointer;
    }
}

void Test::addPointer(Pointer *pointer){  
    pointers.append(pointer);
}

/*QPixmap Shape::image() const{

    QPixmap pixmap(250, 250);
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
    painter.setPen(QPen(Qt::black, 8));
    painter.translate(125, 125);
    painter.drawPolyline(myPolygon);

    return pixmap;
}*/

void Test::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){
    scene()->clearSelection();
    setSelected(true);
    myContextMenu->exec(event->screenPos());
}

QVariant Test::itemChange(GraphicsItemChange change,const QVariant &value){
    if (change == QGraphicsItem::ItemPositionChange){
        foreach (Pointer *pointer, pointers){
            pointer->updatePosition();
        }
    }
    return value;
}


Брал тут http://doc.crossplatform.ru/qt/4.3.5/graph...amitem-cpp.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 9:28
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Tin-moon, я не понимаю, зачем ты свой класс делаешь?
Вот в классе DiagramItem, есть некий задел и его бы использовал. В частности посмотри конструктор класса, там есть оператор switch
и в нём условие case StartEnd: судя по всему оно ни когда не выполняется, однако там есть интересный код (создаются дуги), вот его и воспроизвести. В вести дополнительный тип, например, MyArc
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tin-moon
  опции профиля:
сообщение 12.4.2010, 9:36
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 11.4.2010
Пользователь №: 1620

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 12.4.2010, 9:28) *
Tin-moon, я не понимаю, зачем ты свой класс делаешь?
Вот в классе DiagramItem, есть некий задел и его бы использовал. В частности посмотри конструктор класса, там есть оператор switch
и в нём условие case StartEnd: судя по всему оно ни когда не выполняется, однако там есть интересный код (создаются дуги), вот его и воспроизвести. В вести дополнительный тип, например, MyArc



Он то не используется, но там помоему строится параллелограм если его включить в MainWindow, я просто хочу запихнуть круг к тем которые есть, а оно отрисовываем мой paint по тому многоугольнику из swith

Читал у вас на форуме там человек решил с помощью QPainter, но не написал как и не появлялся уже давно у вас...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 9:44
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Tin-moon @ 12.4.2010, 13:36) *
я просто хочу запихнуть круг к тем которые есть,
при данной архитектуре я это вижу так:
В главное окно добавить кнопку, которая будет сигнализировать сцене о новом режиме, т.е.
scene->setItemType(DiagramItem::DiagramType(id));
         scene->setMode(DiagramScene::InsertItem);
соответственно DiagramScene добавить новый тип, и в операторе switch (конструктора DiagramItem), реализовать новый способ создания контура рисования (QPainterPath)

Всё
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tin-moon
  опции профиля:
сообщение 12.4.2010, 10:17
Сообщение #10


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 11.4.2010
Пользователь №: 1620

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 12.4.2010, 9:44) *
Цитата(Tin-moon @ 12.4.2010, 13:36) *
я просто хочу запихнуть круг к тем которые есть,
при данной архитектуре я это вижу так:
В главное окно добавить кнопку, которая будет сигнализировать сцене о новом режиме, т.е.
scene->setItemType(DiagramItem::DiagramType(id));
         scene->setMode(DiagramScene::InsertItem);
соответственно DiagramScene добавить новый тип, и в операторе switch (конструктора DiagramItem), реализовать новый способ создания контура рисования (QPainterPath)

Всё


Поскольку я ток начал работать с Qt :) Можно вопрос чайника?? Ругается на недекларированый id, и разве с помощью QPainterPath можно отрисовать круг?


Плохо что нету редактирования а все пишет в одно :) спс вроде стало рисовать, вот только проблема стрелка далеко от элементов, может подскажешь как вернуть к кругу??

Сообщение отредактировал ViGOur - 12.4.2010, 10:23
Причина редактирования: Убрал ненужные циататы самого себя из этого же поста... Редактирование у тебя появится после 10 сообщений. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 24.4.2024, 5:06