Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: dmig2006 от Июль 28, 2016, 10:21



Название: 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'а, для получения координат, нужно сделать обратное действие

Код
C++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QLabel>
#include <QFormLayout>
#include <QMouseEvent>
 
 
class Widget : public QWidget
{
   Q_OBJECT
 
   public:
       Widget(QWidget *parent = 0) : QWidget() {
           QFormLayout* layout = new QFormLayout();
           layout->addRow("Global: ", &labelGlobal);
           layout->addRow("Local: ", &labelLocal);
 
           setLayout(layout);
 
           setMouseTracking(true);
       }
 
   private:
       QLabel labelGlobal;
       QLabel labelLocal;
 
   protected:
       void mouseMoveEvent(QMouseEvent* event) {
           QPoint pos = event->pos();
           labelLocal.setText(QString("%1x%2").arg(pos.x()).arg(pos.y()));
 
           pos = mapToGlobal(pos);
           labelGlobal.setText(QString("%1x%2").arg(pos.x()).arg(pos.y()));
 
           QWidget::mouseMoveEvent(event);
       }
};
 
#endif // WIDGET_H
 


Название: Re: QCursor и widget
Отправлено: dmig2006 от Июль 28, 2016, 14:03
Спасибо, сейчас доразбираюсь в чем была проблема.