Название: QCursor и widget Отправлено: dmig2006 от Июль 28, 2016, 10:21 Добрый день такая проблема. Есть виджет, например centralWidget. Надо получить координаты мыши именно на этом виджете или переместить курсор мыши в центр виджета с координатами данного виджета. Мышь нельзя трогать, если использовать движение мыши или нажатие кнопки, то все работает как надо через mouseMoveEvent, mousePressEvent, и mouseReleaseEvent. Функции QCursor::setPos устанавливает в позиции относительно разрешения экрана, а получение координат наподобии QPoint p = widget->mapFromGlobal(QCursor::pos()), QPoint p = widget->mapToParent(QCursor::pos()), возвращает тоже глобальные координаты. При этом если начать двигать мышь, то Qt перехватывает событие мыши и выдает координаты относительно виджета. Как это можно решить? Что я проглядел из возможных функций QPoint, QWidget, QCursor?
Название: Re: QCursor и widget Отправлено: gil9red от Июль 28, 2016, 11:15 Покажите проблемный код
Название: Re: QCursor и widget Отправлено: dmig2006 от Июль 28, 2016, 11:41 #include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui -> setupUi(this); mOptWidget = new OptWidget(this); mOptWidget ->setGeometry(10, 35, 758, 768); ///Получаем координаты при движении курсора (Работает в координатах виджета) mOptWidget->setMouseTracking(true); this->setMouseTracking(true); this->centralWidget()->setMouseTracking(true); ///Попытки поменять систему координат из глобальных в координаты виджета, ///Или встать на попытку в виджете класса OptWidget, координаты используемые в окне QCursor::setPos(WIDTH_DISPLAY/2, HEIGHT_DISPLAY/2); mOptWidget->posLabel1("200",WIDTH_DISPLAY/2, HEIGHT_DISPLAY/2); } void MainWindow::mouseMoveEvent(QMouseEvent *mouse) { //qDebug() << mouse -> pos().x() << mouse -> pos().y(); mOptWidget -> posLabel1("текст", mouse -> pos().x(),mouse -> pos().y()); mOptWidget -> posLabel2("текст", "текст", mouse -> pos().x(), mouse -> pos().y()); } #include "optwidget.h" #include "ui_optwidget.h" OptWidget::OptWidget(QWidget *parent) : QWidget(parent), ui(new Ui::OptWidget) { ui -> setupUi(this); ///Метки в которых выводится какой то текст, отеносительно курсора в виджете OptWidget label1 = new QLabel(this); label2 = new QLabel(this); label3 = new QLabel(this); label4 = new QLabel(this); //смена иконки курсора setCursorMouse(); } void OptWidget::setCursorMouse() { QPixmap curPix; curPix.load("картинка"); // curPix.loadFromData(mImage,100); QCursor cur(curPix); setCursor(cur); ///Попытки изменить систему координат из глобальной в координаты виджета /// Или переместить курсор на позицию по координатам виджета а не глобальным } void OptWidget::posLabel1(QString pStr, float pPosX, float pPosY) { posX=pPosX; posY=pPosY; qDebug() << pPosX << pPosY; label1 -> setGeometry(posX - 110, posY - 120, 80, 20); label1 -> setText(""); label2 -> setGeometry(posX - 85, posY - 105, 30, 30); label2 -> setText(pStr); } void OptWidget::posLabel2(QString str, QString str1, float pPosX, float pPosY) { posX=pPosX; posY=pPosY; label3 -> setGeometry(posX + 50, posY - 120, 80, 20); label3 -> setText(str); label4 -> setGeometry(posX + 58, posY - 105, 30, 30); label4 -> setText(str1); } Название: Re: QCursor и widget Отправлено: dmig2006 от Июль 28, 2016, 11:53 Суть в том. чтобы у меня выводился текст Qlabel около курсора мыши, он зависит от того как мы двигаем мышь. При движении все выводится, но в самом начале запуска пока не тронешь ее ничего не выводится, потом что координаты считаются глобальным, зависят от разрешения экрана. А нужны координаты виджета. А при запуске программы, мышь может быть где угодно, поэтому просто задать позицию Qlabel нельзя, она привязана к координатам мыши
Название: Re: QCursor и widget Отправлено: Bepec от Июль 28, 2016, 12:20 QPoint QWidget::mapTo(const QWidget *parent, const QPoint &pos) const
QPoint QWidget::mapToGlobal(const QPoint &pos) const QPoint QWidget::mapFrom(const QWidget *parent, const QPoint &pos) const QPoint QWidget::mapFromGlobal(const QPoint &pos) const Название: Re: QCursor и widget Отправлено: dmig2006 от Июль 28, 2016, 12:31 В том то и дело у меня не получаются переводы может не правильно пишу
QPoint p = mOptWidget->mapTo(this,QCursor::pos()); qDebug() << p.x() << p.y(); выводит по координатам экрана. Аналогично с другими функциями Название: Re: QCursor и widget Отправлено: gil9red от Июль 28, 2016, 12:39 В том то и дело у меня не получаются переводы может не правильно пишу QPoint p = mOptWidget->mapTo(this,QCursor::pos()); qDebug() << p.x() << p.y(); выводит по координатам экрана. Аналогично с другими функциями А QPoint QWidget::mapFromGlobal(const QPoint &pos) const? Название: Re: QCursor и widget Отправлено: dmig2006 от Июль 28, 2016, 12:47 В том то и дело у меня не получаются переводы может не правильно пишу QPoint p = mOptWidget->mapTo(this,QCursor::pos()); qDebug() << p.x() << p.y(); выводит по координатам экрана. Аналогично с другими функциями А QPoint QWidget::mapFromGlobal(const QPoint &pos) const? Значение были тоже в глобальной системе координат Название: Re: QCursor и widget Отправлено: Igors от Июль 28, 2016, 13:39 Значение были тоже в глобальной системе координат mapFromGlobal вернуло в глобальной? Перепроверьте, так быть не должно, по крайней мере если виджет уже на экранеНазвание: Re: QCursor и widget Отправлено: gil9red от Июль 28, 2016, 13:47 Набросал пример, которые показывает локальные координаты (относительно виджета) и глобальные (в проекте в cpp файлик нужно будет перенести реализацию методов).
Т.к. mouseMoveEvent возвращает локальные координаты, то нужно было перевести их в глобальные. Если используется метод QCursor'а, для получения координат, нужно сделать обратное действие Код
Название: Re: QCursor и widget Отправлено: dmig2006 от Июль 28, 2016, 14:03 Спасибо, сейчас доразбираюсь в чем была проблема.
|