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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Положение мыши в QGraphicsView.  (Прочитано 11809 раз)
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()));
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 22, 2012, 16:58 »

Что такое Widget?
Записан

Qt 5.11/4.8.7 (X11/Win)
kip_one
Гость
« Ответ #2 : Сентябрь 22, 2012, 18:05 »

Класс в котором объявлен прототип
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 22, 2012, 22:20 »

Класс в котором объявлен прототип
И какое отношение он имеет к QGraphicsView Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
kip_one
Гость
« Ответ #4 : Сентябрь 22, 2012, 22:36 »

QGraphicsView у меня находится на форме.
Записан
kip_one
Гость
« Ответ #5 : Сентябрь 23, 2012, 21:53 »

Пока я не понял в чем моя ошибка. Буду рад любым советам
Записан
V1KT0P
Гость
« Ответ #6 : Сентябрь 23, 2012, 22:42 »

Пока я не понял в чем моя ошибка. Буду рад любым советам
Я например так и не понял что именно ты хочешь, то что координаты это понятно, но вот относительно чего: самого графиквиева, виджета на котором он находится, окна, экрана. Скажи точно что хочешь и выложи минимальный проект где это не работает.
Записан
kip_one
Гость
« Ответ #7 : Сентябрь 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;
Записан
V1KT0P
Гость
« Ответ #8 : Сентябрь 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 вносит искажения в координаты если его не учитывать.
Записан
kip_one
Гость
« Ответ #9 : Сентябрь 23, 2012, 23:45 »

Я наверно не правильно излагаю требования.

Когда курсор находится в graphicsview , то в label пишутся координаты курсора.Если же он не в graphicsview, то координаты не пишутся
Вот скрин
Записан
V1KT0P
Гость
« Ответ #10 : Сентябрь 24, 2012, 07:28 »

Когда курсор находится в graphicsview , то в label пишутся координаты курсора.Если же он не в graphicsview, то координаты не пишутся
Ладно не хочешь выкладывать минимальный проект, тогда я выкладываю минимальный проект в котором все работает и сделано правильным способом.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Сентябрь 24, 2012, 11:08 »

Здесь 2 варианта:
1. перегрузить QGraphicsView::mouseMoveEvent()
2. в Widget повесить eventFilter() на ui->graphicsView и уже в нём отлавливать перемещение мыши
Записан

Qt 5.11/4.8.7 (X11/Win)
kip_one
Гость
« Ответ #12 : Сентябрь 24, 2012, 20:24 »

Вот мой минимальный проект и я уже не знаю в чем проблема.
Записан
V1KT0P
Гость
« Ответ #13 : Сентябрь 24, 2012, 21:11 »

Вот мой минимальный проект и я уже не знаю в чем проблема.
Ты просто не понял как я преобразовал QGraphicsView в MyGraphicsView в дизайнере.
Жмешь в дизайнере правой кнопкой на том объекте от которого хочешь наследоваться и чтоб он был в дизайнере и выбираешь "Преобразовать в..." там появится окошко как в аттаче. Вбиваешь новое имя класса и имя заголовочного файла, жмешь добавить и преобразовать. Создаешь теперь заголовочный и исходный файл в соответствии с тем названием что ты выбрал(Жалко что оно не само генерируется) и там описываешь новый класс. Очень удобно когда тебе хочется одновременно и унаследоваться от какого-либо класс и в дизайнере его визуально разместить.
Если вдруг после компиляции будет ругаться то очисти проект и если не удалился файл ui_widget.h, то удали. После того как он снова сгенерируется дизайнером то там будет уже не QGraphicsView а твой MyGraphicsView.
Записан
kip_one
Гость
« Ответ #14 : Сентябрь 24, 2012, 22:26 »

Большое спасибо за объяснение я так понял азов Улыбающийся Все получилось и даже работает правильно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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