鼠标移动到widget上?
鼠标移动到widget上,该widget高亮显示,并执行相应动作。鼠标移开,又恢复原样,请问该使用什么函数? --------------------编程问答-------------------- 鼠标事件 或者 在widget上添加事件过滤器。。。 --------------------编程问答-------------------- virtual void mouseMoveEvent ( QMouseEvent * event )重写这个函数,你可以获取鼠标当前坐标,然后判断这个坐标是都在widget中。 --------------------编程问答-------------------- QWidget有两个事件,一个是鼠标进入,一个是鼠标离开.
void enterEvent(QEvent *e);
void leaveEvent(QEvent *e);
重载这两个事件在实现就可以了。
--------------------编程问答--------------------
这个具体怎么实现?
举个例子,有一个Widget,里面有两个label,一个是finishLabel,一个是cancelLabel。当鼠标移动到这两个label上时,进行不同的操作,代码如下:
void RubberBandWidget::mouseMoveEvent(QMouseEvent *event)
{
QRect finishLabelRect = finishLabel->frameGeometry();
QRect cancelLabelRect = cancelLabel->frameGeometry();
qDebug() << "rect:" << finishLabelRect.topLeft() << finishLabelRect.bottomRight();
QPoint p = event->pos();
qDebug() << "point:" << p;
if(finishLabelRect.contains(p))
{
qDebug() << "contains...";
finishLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_finish_gray.png"));
cancelLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_cancel.png"));
}
else if(cancelLabelRect.contains(p))
{
finishLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_finish.png"));
cancelLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_cancel_gray.png"));
}
else{
finishLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_finish.png"));
cancelLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_cancel.png"));
}
}
但是为什么不管我怎么移动鼠标,打印出来的坐标始终落在两个label外,这是何解?我的代码有错吗?请指教。 --------------------编程问答-------------------- .h文件:
protected:
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
.cpp文件
void RubberBandWidget::enterEvent(QEvent *)
{
//xxxxLabel->setPixmap
}
void RubberBandWidget::leaveEvent(QEvent *)
{
//?????Label->setPixmap
}
--------------------编程问答--------------------
要某个QLabel检测鼠标移动,就要继承QLabel,把上面的代码写到继承QLabel的类里面。 --------------------编程问答--------------------
void enterEvent(QEvent *e);--------------------编程问答-------------------- 我用一下代码解决了:
--------------------编程问答--------------------
bool RubberBandWidget::eventFilter(QObject *object, QEvent *event)
{
if(object == finishLabel)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if(mouseEvent->button() == Qt::LeftButton)
{
emit shotScreen();
return true;
}
}
else if(event->type() == QEvent::Enter)
{
finishLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_finish_gray.png"));
return true;
}
else if(event->type() == QEvent::Leave)
{
finishLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_finish.png"));
return true;
}
}
else if(object == cancelLabel)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if(mouseEvent->button() == Qt::LeftButton)
{
emit closeMainWindow();
return true;
}
}
else if(event->type() == QEvent::Enter)
{
cancelLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_cancel_gray.png"));
return true;
}
else if(event->type() == QEvent::Leave)
{
cancelLabel->setPixmap(QPixmap(":/sunsong/images/shotscreen_cancel.png"));
return true;
}
}
return QWidget::eventFilter(object, event);
}
这是我摘取的部分代码,关键的地方是event->type() == QEvent::Enter,这个是鼠标进入QLabel。另外一个是event->type() == QEvent::Leave,这个是鼠标离开QLabel。
补充:移动开发 , Qt