• 5529阅读
  • 2回复

【Sorry】发错地方了:当鼠标移动到按钮上时的事件响应与rect.contions()的bug? [复制链接]

上一主题 下一主题
离线prout
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-12
MoveButton::MoveButton(QWidget *parent, Qt::WFlags flags)
    : QDialog(parent, flags)
{
    ui.setupUi(this);
    setMouseTracking(true);
}

MoveButton::~MoveButton()
{

}

void MoveButton::mouseMoveEvent(QMouseEvent *event)
{
    QRect rect = ui.buttonNo->geometry();
    QPoint point = event->pos();

    if (rect.contains(point))
    {
        ui.buttonNo->move(qrand()%width(),qrand()%height());
    }
}

reference上这么写道
If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved. If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed.

但是即使setMouseTracking(true);后也无法在不按鼠标左键右键的时候实时响应移动函数,

但是 如果将if (rect.contains(point)) 去掉 之后就可以实时响应了?

为何?这是qt的bug么?
[ 此帖被prout在2009-12-13 00:06重新编辑 ]
离线qulu2009
只看该作者 1楼 发表于: 2009-12-14
我的情况差不多,即使setMouseTracking(true);后也无法在不按鼠标左键右键的时候实时响应mousemoveEvent 事件,感觉是个bug,不知道有没有解决的方案
离线prout
只看该作者 2楼 发表于: 2009-12-14
引用第1楼qulu2009于2009-12-14 13:03发表的  :
我的情况差不多,即使setMouseTracking(true);后也无法在不按鼠标左键右键的时候实时响应mousemoveEvent 事件,感觉是个bug,不知道有没有解决的方案



经过测试:

mouseEvent->pos()得到的是相对于 widget的坐标,

如果把代码写成这样:

void MoveButton::mouseMoveEvent(QMouseEvent *event)
{
    QRect rect = ui.buttonNo->geometry();
    QPoint point = event->globalPos();
    ui.lineEdit->setText(QString(QString::number(point.x())+","+QString::number(point.y())));
    ui.ButtonNoPosEdit->setText(QString(QString::number(rect.x())+","+QString::number(rect.y())));
    if (rect.contains(point))
    {
        ui.buttonNo->move(qrand()%width(),qrand()%height());
    }
}

那么不需要按鼠标左右键也能得到实时响应。 但是是相对于全局系统坐标的。

但是一旦改成mouseEvent->pos() 坐标是和按钮坐标一致时并按着鼠标左右键才会发成响应。

经过观察:

通过  ui.buttonNo->geometry(); 得到的rect 比 实际 button 的有效区域大出一个像素的坐标值。

所以 代码 给成这样

    QRect rect = ui.buttonNo->frameGeometry();
    QPoint point = event->pos();
    QSize size = rect.size()-QSize(-2,-2);
    QRect dstRect = QRect(QPoint(rect.x()-1,rect.y()-1),size);
    ui.lineEdit->setText(QString(QString::number(point.x())+","+QString::number(point.y())));
    ui.ButtonNoPosEdit->setText(QString(QString::number(dstRect.x())+","+QString::number(dstRect.y())));
    if (dstRect.contains(point))
    {
        ui.buttonNo->move(qrand()%width(),qrand()%height());
    }

就能正确运行了。。
快速回复
限100 字节
 
上一个 下一个