当前位置:编程学习 > wap >>

鼠标移动到widget上?

鼠标移动到widget上,该widget高亮显示,并执行相应动作。
鼠标移开,又恢复原样,请问该使用什么函数? --------------------编程问答-------------------- 鼠标事件  或者  在widget上添加事件过滤器。。。 --------------------编程问答-------------------- virtual void mouseMoveEvent ( QMouseEvent * event )重写这个函数,你可以获取鼠标当前坐标,然后判断这个坐标是都在widget中。 --------------------编程问答-------------------- QWidget有两个事件,一个是鼠标进入,一个是鼠标离开.
    
    void enterEvent(QEvent *e);
    void leaveEvent(QEvent *e);

重载这两个事件在实现就可以了。

--------------------编程问答--------------------
引用 2 楼  的回复:
virtual void mouseMoveEvent ( QMouseEvent * event )重写这个函数,你可以获取鼠标当前坐标,然后判断这个坐标是都在widget中。

这个具体怎么实现?
举个例子,有一个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
}

--------------------编程问答--------------------
引用 5 楼  的回复:
.h文件:
C/C++ code

protected:
    void enterEvent(QEvent *);
    void leaveEvent(QEvent *);


.cpp文件
C/C++ code

void RubberBandWidget::enterEvent(QEvent *)
{
    //xxxxLabel->setPixmap
}

void R……

要某个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);
}
--------------------编程问答--------------------
引用 8 楼  的回复:
我用一下代码解决了:

C/C++ code



bool RubberBandWidget::eventFilter(QObject *object, QEvent *event)
{
    if(object == finishLabel)
    {
        if(event->type() == QEvent::MouseButtonPress)
    ……

这是我摘取的部分代码,关键的地方是event->type() == QEvent::Enter,这个是鼠标进入QLabel。另外一个是event->type() == QEvent::Leave,这个是鼠标离开QLabel。
补充:移动开发 ,  Qt
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,