Qt鼠标点击检测不能一直工作

时间:2010-08-10 17:23:49

标签: c++ qt

Qt让我质疑我的理智和存在。我不知道为什么在我写的一个程序中起作用的代码在我写的另一个程序中不起作用。以下代码在两个程序中都是相同的。在P1中它只能通过左键单击才能正常工作。在P2中它完全相同,只是左键单击代码做了不同的事情。

在P2中,我检查左键单击条件并执行代码(如果为真)。好吧,当我离开或右键单击时,它不会执行代码。如果我更改条件以检查右键单击并返回如果为true,则左键单击正常,但右键单击不会返回。如果我删除条件,左右键都会运行代码。

我正在失去理智,因为像这样的蠢事一直在发生,我不知道为什么即使我做的一切都与其他有效的程序一样(我写的)。

编辑:它似乎忽略了mouseRelease函数中的if-check,并且对mousePress和mouseMove正常工作。

P1(这个程序完全符合我的要求):

void GLWidget::mousePressEvent(QMouseEvent *event)
{
    clickOn = event->pos();
    clickOff = event->pos();

    // right mouse button
    if (event->buttons() & Qt::RightButton){
        return;
    }

    // rest of left-click code here
}

/*************************************/

void GLWidget::mouseReleaseEvent(QMouseEvent *event)
{
    clickOff = event->pos();

    // right mouse button shouldn't do anything
    if (event->buttons() & Qt::RightButton)
        return;

    // rest of left click code here

}

/*************************************/

void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
    clickOff = event->pos();

    // do it only if left mouse button is down
    if (event->buttons() & Qt::LeftButton) {

        // left click code

        updateGL();

    } else if(event->buttons() & Qt::RightButton){

        // right mouse button code

    }
}

P2(结构类似于P1,但无法正常工作):

void GLWidget::mousePressEvent(QMouseEvent *event)
{
    clickOn = event->pos();
    clickOff = event->pos();

    // do it only if left mouse button is down
    if (event->buttons() & Qt::LeftButton) {
        // left click code
    }

}

void GLWidget::mouseReleaseEvent(QMouseEvent *event)
{
    clickOff = event->pos();

    // do it only if left mouse button is down
    if (event->buttons() & Qt::LeftButton) {
        // left click code
    }

}

void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
    clickOff = event->pos();
    clickDiff = clickOff - clickOn;

    // do it only if left mouse button is down
    if (event->buttons() & Qt::LeftButton) {
        // left click code
        updateGL();
    }
}

1 个答案:

答案 0 :(得分:3)

来自QMouseEvent::buttons() documentation

  

对于鼠标释放事件,这会排除导致事件发生的按钮。

所以解决方法是使用QMouseEvent :: button()代替:

void GLWidget::mouseReleaseEvent(QMouseEvent *event)
{
    clickOff = event->pos();

    // do it only if left mouse button is down
    if (event->button() == Qt::LeftButton) {
        // left click code
    }
}