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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Создание "легенды" на карте  (Прочитано 18354 раз)
mell
Гость
« Ответ #15 : Октябрь 18, 2009, 16:21 »

мне почему-то такая вещь не помогает, как собственно и другие мышиные обработчики
Код:
void wheelEvent ( QWheelEvent * event ) 
{
     event->ignore();
}

Записан
Barmaglodd
Гость
« Ответ #16 : Октябрь 19, 2009, 07:36 »

parent точно QGraphicsView?
Записан
mell
Гость
« Ответ #17 : Октябрь 19, 2009, 22:03 »

Вот как я это делаю:

GraphicsScene.h:
Код:
#include "GraphicsLegend.h"

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsTextItem>

class GraphicsScene : public QGraphicsScene
{
public:
    GraphicsScene();
QGraphicsView *getView() { return &view; }

private:
QGraphicsView view;
GraphicsLegend legend;

void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);

};

GraphicsScene.cpp:
Код:
#include "GraphicsScene.h"

GraphicsScene::GraphicsScene()
: legend (&view)
{
view.setScene(this);
QGraphicsTextItem *text = this->addText("text");
text->setPos(200,200);
}

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *)
{
exit(1);
}

соответственно в классе легенды:

GraphicsLegend.h:
Код:
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>

class GraphicsLegend : public QWidget
{
Q_OBJECT
public:
GraphicsLegend(QWidget* parent);

protected:
void paintEvent(QPaintEvent* ev);
bool eventFilter(QObject *obj, QEvent *ev);

virtual void mousePressEvent ( QMouseEvent * event )
{
event->ignore();
}

void wheelEvent ( QWheelEvent * event )
{
event->ignore();
}
};

ни клики, ни колесико в GraphicsScene не обрабатывается....
« Последнее редактирование: Октябрь 20, 2009, 12:18 от mell » Записан
Barmaglodd
Гость
« Ответ #18 : Октябрь 20, 2009, 08:29 »

Текст конструктора GraphicsScene можно? Меня терзают смутные сомнения, что у legend конструктор вызван с parent=0.
Записан
mell
Гость
« Ответ #19 : Октябрь 20, 2009, 12:24 »

текст конструктора привел во втором листинге (GraphicsScene.cpp)

соответственно то-же самое, если в конструкторе написать :
Код:
GraphicsLegend *legend = new GraphicsLegend(&view);
Записан
Barmaglodd
Гость
« Ответ #20 : Октябрь 21, 2009, 08:34 »

У меня всё работает, не знаю в чём проблема.
Версия Qt какая?
Записан
mell
Гость
« Ответ #21 : Октябрь 21, 2009, 14:10 »

Barmaglodd, в твоем примере не передается парент в базовый класс... поэтому и воводиться легенда не будет
Код:
GraphicsLegend(QWidget* parent)
{
    resize(parent->size());
    parent->installEventFilter(this);
 }

а вот так выводиться, он не работает мышь
Код:
class GraphicsLegend : public QWidget
{
Q_OBJECT
public:
GraphicsLegend(QWidget* parent)
: QWidget (parent)
    {
        resize(parent->size());
        parent->installEventFilter(this);
    }

protected:
void paintEvent(QPaintEvent* ev)
    {
QPainter painter(this);
painter.drawText(50, 50, "!!");
    }

bool eventFilter(QObject *obj, QEvent *ev)
    {
        if(obj==parentWidget() && ev->type()==QEvent::Resize)
            resize(parentWidget()->size());
        return false;
    }
};

Qt 4.5.0 linux/windows
Записан
Barmaglodd
Гость
« Ответ #22 : Октябрь 22, 2009, 08:43 »

Нашёл в чём косяк. Я работаю не с QGraphicsView, а со своим виджетом. Если отдебажить обработку нажатия мыши, то видно, что QAbstractScrollArea в методе event тупо съедает все события от мыши, и не вызывает QFrame::event, где должен быть вызов QWidget::event, где уже вызываются конкретные обработчики mousePressEvent и т.п. Так что, либо реализовывать корректно event в наследнике от QGraphicsView, либо искать какие-то другие решения.
Записан
mell
Гость
« Ответ #23 : Октябрь 22, 2009, 11:13 »

спасибо, помогли разобраться:)
Если в GraphicsScene использовать такой GraphicsView:
Код:
#include <QGraphicsView>
#include <QEvent>

class GraphicsView : public QGraphicsView
{
public:
    GraphicsView();

protected:
virtual bool event(QEvent *event)
{
if (event->type() == QEvent::MouseButtonPress) {
this->mousePressEvent((QMouseEvent *)event);
return false;
}
else if ( event->type() == QEvent::Wheel ) {
this->wheelEvent((QWheelEvent *)event);
return false;
}
// else if ... и т.д.

return QGraphicsView::event(event);
}
};
то все работает. Надеюсь решение "красивое".
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Октябрь 22, 2009, 12:26 »

то все работает. Надеюсь решение "красивое".
switch (event->type()) смотрится лучше и править удобнее
Записан
developer-nsk
Гость
« Ответ #25 : Октябрь 23, 2009, 13:25 »

что-то у меня пример Barmaglodd-а мало того, что перехватывает wheelEvent у QGraphicsView, так и мышь полностью не работоспособна в QGraphiscScene... может есть у кого примеры поподробнее?


Чёрт, на самом деле я тоже ошибся... В действительности пример Barmaglodd-а у меня не заработал... Господа, подскажите, пожалуйста, как бороться с проблемой того, что виджет перехватывает на себя все события, типа wheelEvent, хотя очень хочется, чтобы их обрабатывал parentWidget? Заранее спасибо!
Записан
mell
Гость
« Ответ #26 : Октябрь 23, 2009, 15:01 »

чуть выше приведен пример наследника QGraphicsView
« Последнее редактирование: Октябрь 23, 2009, 17:34 от mell » Записан
developer-nsk
Гость
« Ответ #27 : Октябрь 23, 2009, 17:04 »

Спасибо, сейчас попробую :-)
Записан
fuCtor
Гость
« Ответ #28 : Октябрь 28, 2009, 12:18 »

Чтобы не плодить темы задам вопрос здесь.

Можно ли тоже самое реализовать, но используя QStackedLayout? Если выставить:
stackLayout_->setStackingMode(QStackedLayout::StackAll);
И первым добавить карту, а потом все остальное поверх, то видно и то и то, но как сделать, чтобы сообщения прокидывались на карту, а не перехватывались верхним.
Если для верхнего виджета установить атрибут "прозрачный для мыши", то карта получает сообщения, но элементы лежащие над картой нет.
Записан
mell
Гость
« Ответ #29 : Октябрь 28, 2009, 15:21 »

попробуй где-нибудь перехватывать QEvent, как в моем примере выше, и пересылать их на виджет-карту
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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