Russian Qt Forum

Qt => Вопросы новичков => Тема начата: kip_one от Сентября 22, 2012, 16:53



Название: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 22, 2012, 16:53
Задача вроде не сложная, но где-то я не правильно делаю.
Идея в том, что бы вывести в QLabel координаты мыши (х,у), при её нахождении в QGraphicsScene.
Вот код:
void Widget::mouseMoveEvent(QMouseEvent* event){
    QPoint viewPos = event->pos();
    QPointF scenePos(ui->graphicsView->mapToScene(viewPos));
    ui->label->setText(QString::number(scenePos.rx())+"  "+QString::number(scenePos.y()));
}


Название: Re: Положение мыши в QGraphicsView.
Отправлено: GreatSnake от Сентября 22, 2012, 16:58
Что такое Widget?


Название: Re: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 22, 2012, 18:05
Класс в котором объявлен прототип


Название: Re: Положение мыши в QGraphicsView.
Отправлено: GreatSnake от Сентября 22, 2012, 22:20
Класс в котором объявлен прототип
И какое отношение он имеет к QGraphicsView ???


Название: Re: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 22, 2012, 22:36
QGraphicsView у меня находится на форме.


Название: Re: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 23, 2012, 21:53
Пока я не понял в чем моя ошибка. Буду рад любым советам


Название: Re: Положение мыши в QGraphicsView.
Отправлено: V1KT0P от Сентября 23, 2012, 22:42
Пока я не понял в чем моя ошибка. Буду рад любым советам
Я например так и не понял что именно ты хочешь, то что координаты это понятно, но вот относительно чего: самого графиквиева, виджета на котором он находится, окна, экрана. Скажи точно что хочешь и выложи минимальный проект где это не работает.


Название: Re: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 23, 2012, 23:11
Относительно QGraphicView.

widget.h
Код:
class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
   ....
    QGraphicsScene scene;

protected:
    virtual void mouseMoveEvent ( QMouseEvent * event );
};

#endif // WIDGET_H

widget.cpp
Код:
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setMouseTracking(true);
    ui->graphicsView->setScene(&scene);
    ...
}

void Widget::mouseMoveEvent(QMouseEvent* event){
    QPointF scenePos = ui->graphicsView->mapToScene(event->pos());
    ui->label->setText(QString::number(scenePos.x())+"  "+QString::number(scenePos.y()));
}


Нужно что бы ui->label выводило координаты курсора(х,у) относительно  ui->graphicsview;


Название: Re: Положение мыши в QGraphicsView.
Отправлено: V1KT0P от Сентября 23, 2012, 23:29
Если не хочешь заморачиваться с мапами туда сюда, то вот такой грязный хак который тем не менее будет работать 100%:
Код
C++ (Qt)
   QPoint globalPos = this->mapToGlobal( event->pos() );
   QPoint scenePos = ui->graphicsView->mapFromGlobal( globalPos );
   ui->label->setText(QString::number(scenePos.x())+"  "+QString::number(scenePos.y()));
Ибо если делать правильно:
Код
C++ (Qt)
QPoint scenePos = ui->graphicsView->mapFromParent( event->pos() );
надо много всяких моментов учитывать, например наличие QToolBar вносит искажения в координаты если его не учитывать.


Название: Re: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 23, 2012, 23:45
Я наверно не правильно излагаю требования.

Когда курсор находится в graphicsview , то в label пишутся координаты курсора.Если же он не в graphicsview, то координаты не пишутся
Вот скрин
(http://www.imgup.ru/images_small/qv5x964109.jpg) (http://www.imgup.ru/image-qv5x964109.html)


Название: Re: Положение мыши в QGraphicsView.
Отправлено: V1KT0P от Сентября 24, 2012, 07:28
Когда курсор находится в graphicsview , то в label пишутся координаты курсора.Если же он не в graphicsview, то координаты не пишутся
Ладно не хочешь выкладывать минимальный проект, тогда я выкладываю минимальный проект в котором все работает и сделано правильным способом.


Название: Re: Положение мыши в QGraphicsView.
Отправлено: GreatSnake от Сентября 24, 2012, 11:08
Здесь 2 варианта:
1. перегрузить QGraphicsView::mouseMoveEvent()
2. в Widget повесить eventFilter() на ui->graphicsView и уже в нём отлавливать перемещение мыши


Название: Re: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 24, 2012, 20:24
Вот мой минимальный проект и я уже не знаю в чем проблема.


Название: Re: Положение мыши в QGraphicsView.
Отправлено: V1KT0P от Сентября 24, 2012, 21:11
Вот мой минимальный проект и я уже не знаю в чем проблема.
Ты просто не понял как я преобразовал QGraphicsView в MyGraphicsView в дизайнере.
Жмешь в дизайнере правой кнопкой на том объекте от которого хочешь наследоваться и чтоб он был в дизайнере и выбираешь "Преобразовать в..." там появится окошко как в аттаче. Вбиваешь новое имя класса и имя заголовочного файла, жмешь добавить и преобразовать. Создаешь теперь заголовочный и исходный файл в соответствии с тем названием что ты выбрал(Жалко что оно не само генерируется) и там описываешь новый класс. Очень удобно когда тебе хочется одновременно и унаследоваться от какого-либо класс и в дизайнере его визуально разместить.
Если вдруг после компиляции будет ругаться то очисти проект и если не удалился файл ui_widget.h, то удали. После того как он снова сгенерируется дизайнером то там будет уже не QGraphicsView а твой MyGraphicsView.


Название: Re: Положение мыши в QGraphicsView.
Отправлено: kip_one от Сентября 24, 2012, 22:26
Большое спасибо за объяснение я так понял азов :) Все получилось и даже работает правильно.