Как заставить QLineEdit следовать за курсором, чтобы показать мне его координаты

Я хочу мое QWidget чтобы показать мне координаты моего курсора, когда он находится на изображении, я прочитал, что лучше всего использовать QLineEdit, но я не нашел, как использовать это, чтобы сделать это. Как начать QLineEdit и как это показать, чтобы он следовал за курсором? PS: я знаю, как установить координаты точек на нем. вот как я это делаю:

void QImageWidget::mouseMoveEvent( QMouseEvent *event ){
   int x = event->pos( ).x();
   int y = event->pos( ).y();
   if( cursorLineEdit != NULL && cursorLineEdit->isEnabled( ) )
       cursorLineEdit->setText( QString( "[ %1 , %2 ]" ).arg( x ).arg( y ) );
}

mouseTracking уже установлен в true:

this->setMouseTracking(true);

Спасибо!

РЕДАКТИРОВАТЬ: cursorLineEdit - это QLineEdit, который я хочу показать, мне нужно инициализировать его в конструкторе QWidget, но я не знаю как!

2 ответа

Решение

Я нахожу еще одно решение, но прежде всего я хочу рассказать вам, почему я решил опубликовать свой ответ здесь. Я думал, что мое решение неэффективно и очень загружает процессор, но когда я запускаю код vahancho, я увидел, что QToolTip тоже загружает процессор (на моем компьютере оба решения могут загружать процессор от 0 до 3 процентов). Так что теперь я думаю, что я могу опубликовать здесь ответ и вы сможете решить, что вы хотите использовать.

Идея: получить положение, создать прозрачное растровое изображение, нарисовать координаты этого растрового изображения, установить это растровое изображение в качестве курсора. Более того, мы будем использовать одну переменную bool (мы не будем рисовать растровое изображение каждый mouseMoveEvent, мы будем рисовать его каждый второй раз (для эффективности))

bool showMustGoOn;//in header

showMustGoOn = false;//in constructor

void QImageWidget::mouseMoveEvent(QMouseEvent *event)
{
    if(showMustGoOn)
    {
    const QPoint &p = event->pos();
    QPixmap px(50,10);
    px.fill(Qt::transparent);
    QPainter paint(&px);
    paint.drawText(10,10,QString("%1,%2").arg(p.x()).arg(p.y()));
    setCursor(QCursor(px));
    showMustGoOn = false;
    }
    else
    {
        showMustGoOn = true;
    }
}

Если вы хотите использовать его, вы можете нарисовать что-то другое, чтобы показать курсор. Еще одним преимуществом является то, что растровое изображение прозрачно, поэтому этот курсор не закрывает другую область (вы видите только цифры, все остальное прозрачно, но подсказка закрывается)

Наконец, в Qwt есть нечто подобное, и я думаю, что это более эффективно, но поиск необходимого кода в исходном коде Qwt может быть очень долгим и сложным.

введите описание изображения здесь

Вы можете сделать следующее:

QImageWidget::QImageWidget()
{
    [..]
    cursorLineEdit = new QLineEdit(this);
    QVBoxLayout layout = new QVBoxLayout(this);
    layout->addWidget(cursorLineEdit);
    setMouseTracking(true);
    [..]
}

а также

void QImageWidget::mouseMoveEvent( QMouseEvent *event )
{
   int x = event->pos().x();
   int y = event->pos().y();
   if (cursorLineEdit->isEnabled())
       cursorLineEdit->setText(QString( "[ %1 , %2 ]" ).arg( x ).arg( y ) );
}

РЕДАКТИРОВАТЬ:

Альтернативный способ - показать подсказку с координатами:

void QImageWidget::mouseMoveEvent(QMouseEvent *event)
{
    const QPoint &p = event->pos();
    QToolTip::showText(mapToGlobal(p),
                       QString("[%1 , %2]").arg(p.x()).arg(p.y()), this,
                       QRect(p, QSize(20, 20)));
}
Другие вопросы по тегам