• 8712阅读
  • 6回复

当鼠标移动到按钮上时的事件响应与rect.contions()的bug? [复制链接]

上一主题 下一主题
离线prout
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-13
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么?
离线daily8321

只看该作者 1楼 发表于: 2009-12-13
判断条件有问题。。。event pos 是screen pos 。geometry 是button 在parent 上的rect .我也不知道怎么说,你看看帮助吧。
离线prout
只看该作者 2楼 发表于: 2009-12-13
引用第1楼daily8321于2009-12-13 18:54发表的  :
判断条件有问题。。。event pos 是screen pos 。geometry 是button 在parent 上的rect .我也不知道怎么说,你看看帮助吧。


恩~~恍然大悟~~但是没想明白该如何处理这个问题,除了重写 button的enter 函数还有其他的判断方法么?
离线daily8321

只看该作者 3楼 发表于: 2009-12-13
你试试把你在button上获取的pos 转换成全局的。globalPos ()
离线prout
只看该作者 4楼 发表于: 2009-12-14
引用第3楼daily8321于2009-12-13 21:27发表的  :
你试试把你在button上获取的pos 转换成全局的。globalPos ()

经过测试:

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());
    }

就能正确运行了。。

谢谢楼上~
离线wywwh
只看该作者 5楼 发表于: 2009-12-15
好的,领教了
离线e2008824
只看该作者 6楼 发表于: 2010-12-09
正解
快速回复
限100 字节
 
上一个 下一个