Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT] Создание Adorner для QGraphicsItem 
:(
    Опции темы
math64
Дата 18.4.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Пробую создать адорнер (кружочки по углам для перемещения и изменения размеров) к QGraphicsItem (пока можно только двигать)
Код

#include <QtGui/QMainWindow>
#include <QGraphicsItem>
#include <QGraphicsScene>
#include <QGraphicsView>

class MyAdorner;
class TestAdornerMW : public QMainWindow
{
    Q_OBJECT

public:
    TestAdornerMW(QWidget *parent = 0);
    ~TestAdornerMW();
    void addAdorner(QGraphicsItem* item);
    void itemChanged(QGraphicsItem* item);
private slots:
    void slotSelectionChanged();
private:
    QGraphicsScene* m_scene;
    MyAdorner* m_adorner;
};

class MyAdorner : public QGraphicsItem
{
public:
    MyAdorner(QGraphicsItem* adorned, TestAdornerMW* test);
    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);

private:
    QGraphicsItem*  m_adorned;
    TestAdornerMW*  m_test;
};

MyAdorner::MyAdorner(QGraphicsItem *adorned, TestAdornerMW* test)
{
    m_test = test;
    setTransform(adorned->transform());
    setPos(adorned->pos());
    m_adorned = adorned;
    setFlag(ItemIsMovable);
    setFlag(ItemIsSelectable);
    setFlag(ItemSendsGeometryChanges);
    setFlag(ItemSendsScenePositionChanges);
    setZValue(1.0E10);
}

MyAdorner::~MyAdorner()
{

}

QRectF MyAdorner::boundingRect() const
{
    return m_adorned->boundingRect().adjusted(-5,-5,5,5);
}
void MyAdorner::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QRectF rect = m_adorned->boundingRect();
    QBrush brush(QColor(0,0,0,1));
    painter->setBrush(brush);
    painter->drawRect(rect);
    painter->setBrush(Qt::blue);
    painter->drawEllipse(rect.topLeft(), 5, 5);
    painter->drawEllipse(rect.topRight(), 5, 5);
    painter->drawEllipse(rect.bottomLeft(), 5, 5);
    painter->drawEllipse(rect.bottomRight(), 5, 5);
}

QVariant MyAdorner::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if(m_adorned != NULL)
        switch(change) {
        case ItemPositionChange:
            m_adorned->setPos(pos());
            m_test->itemChanged(m_adorned);
            break;
        case ItemMatrixChange:
        case ItemTransformChange:
            m_adorned->setTransform(transform());
            m_test->itemChanged(m_adorned);
            break;
        default:
            break;
        }
    return QGraphicsItem::itemChange(change, value);
}

TestAdornerMW::TestAdornerMW(QWidget *parent)
    : QMainWindow(parent)
{
    m_adorner = NULL;
    QPen pen(Qt::black);
    QBrush brush(Qt::green);
    m_scene = new QGraphicsScene();
    m_scene->addEllipse(10, 10, 30, 30, pen, brush)->setFlag(QGraphicsItem::ItemIsSelectable);
    m_scene->addRect(40, 40, 30, 30, pen, brush)->setFlag(QGraphicsItem::ItemIsSelectable);
    QGraphicsView* view = new QGraphicsView(m_scene);
    setCentralWidget(view);
    connect(m_scene, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()));
}

TestAdornerMW::~TestAdornerMW()
{

}

void TestAdornerMW::slotSelectionChanged()
{
    QList<QGraphicsItem*> selection = m_scene->selectedItems();
    if (selection.count() > 0) {
        QGraphicsItem* first = selection.first();
        addAdorner(first);
    } else
        addAdorner(NULL);
}

void TestAdornerMW::addAdorner(QGraphicsItem *item)
{
    if (item != NULL && item->type() == MyAdorner::Type)
        return;
    if (m_adorner == NULL || m_adorner->adorned() != item) {
        if (m_adorner != NULL) {
            m_scene->removeItem(m_adorner);
            delete m_adorner;
            m_adorner = NULL;
        }
        if (item != NULL) {
            m_adorner = new MyAdorner(item, this);
            if (m_adorner != NULL) {
                m_scene->addItem(m_adorner);
                m_adorner->setSelected(true);
            }
        }
    }
}

void TestAdornerMW::itemChanged(QGraphicsItem *item)
{

}

Но положение QGraphicsItem отстаёт от адорнера и после выбора QGraphicsItem нужно ещё раз нажимать на кнопку мыши, чтобы начать двигать адорнер.
PM   Вверх
math64
Дата 18.4.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Для того, чтобы положение QGraphicsItem не отставало от адорнера, нужно убрать у адорнера флаг ItemIsMovable, переопределить mousePressEvent(), mouseMoveEvent() и mouseReleaseEvent() и передвигать QGraphicsItem внутри них. Но кнопку мыши всё равно нужно нажимать два раза.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.