Я хочу мое 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, но я не знаю как!
Я нахожу еще одно решение, но прежде всего хочу сказать вам, почему я решил опубликовать свой ответ здесь. Я думал, что мое решение неэффективно и очень загружает процессор, но когда я запускаю код 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)));
}