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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QCursor и widget  (Прочитано 9209 раз)
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?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 28, 2016, 11:15 »

Покажите проблемный код
Записан

dmig2006
Гость
« Ответ #2 : Июль 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);
}
« Последнее редактирование: Июль 28, 2016, 11:56 от dmig2006 » Записан
dmig2006
Гость
« Ответ #3 : Июль 28, 2016, 11:53 »

Суть в том. чтобы у меня выводился текст Qlabel около курсора мыши, он зависит от того как мы двигаем мышь. При движении все выводится, но в самом начале запуска пока не тронешь ее ничего не выводится, потом что координаты считаются глобальным, зависят от разрешения экрана. А нужны координаты виджета. А при запуске программы, мышь может быть где угодно, поэтому просто задать позицию Qlabel нельзя, она привязана к координатам мыши
« Последнее редактирование: Июль 28, 2016, 11:55 от dmig2006 » Записан
Bepec
Гость
« Ответ #4 : Июль 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
Записан
dmig2006
Гость
« Ответ #5 : Июль 28, 2016, 12:31 »

В том то и дело у меня не получаются переводы может не правильно пишу
    
   QPoint p = mOptWidget->mapTo(this,QCursor::pos());
    qDebug() << p.x() << p.y();

выводит по координатам экрана. Аналогично с другими функциями
« Последнее редактирование: Июль 28, 2016, 12:36 от dmig2006 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Июль 28, 2016, 12:39 »

В том то и дело у меня не получаются переводы может не правильно пишу
    
   QPoint p = mOptWidget->mapTo(this,QCursor::pos());
    qDebug() << p.x() << p.y();

выводит по координатам экрана. Аналогично с другими функциями


А QPoint QWidget::mapFromGlobal(const QPoint &pos) const?
Записан

dmig2006
Гость
« Ответ #7 : Июль 28, 2016, 12:47 »

В том то и дело у меня не получаются переводы может не правильно пишу
    
   QPoint p = mOptWidget->mapTo(this,QCursor::pos());
    qDebug() << p.x() << p.y();

выводит по координатам экрана. Аналогично с другими функциями


А QPoint QWidget::mapFromGlobal(const QPoint &pos) const?

Значение были тоже в глобальной системе координат
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июль 28, 2016, 13:39 »

Значение были тоже в глобальной системе координат
mapFromGlobal вернуло в глобальной? Перепроверьте, так быть не должно, по крайней мере если виджет уже на экране
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Июль 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
 
Записан

dmig2006
Гость
« Ответ #10 : Июль 28, 2016, 14:03 »

Спасибо, сейчас доразбираюсь в чем была проблема.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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