tags:

views:

81

answers:

1

Qt makes me question my sanity and existence. I don't know why code that works in one program that I wrote will not work in another program I wrote. The following code is identical in both programs. In P1 it works correctly by only allowing left clicks. In P2 it is exactly the same, except the left click code is does something different.

In P2 I have it checking the left click condition and do the code if it is true. Well, when I left or right click, it won't do the code. If I change the condition to check for a right click and return if true, then the left click works normally, but right click won't return. If I remove the conditions, both left and right click runs the code.

I am losing my mind because stupid stuff like this keeps happening all the time and I don't know why even though I do everything the same as the other programs that work (that I wrote).

Edit: It seems to ignore the if-check in the mouseRelease function and works correctly for mousePress and mouseMove.

P1 (this program works exactly how I want it to):

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 (structured similar to P1, but doesn't work correctly):

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  A: 

From QMouseEvent::buttons() documentation:

For mouse release events this excludes the button that caused the event.

So the solution is to use QMouseEvent::button() instead:

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
    }
}
Roku
Ah, that worked! Thanks! I'm thinking that P1 may have enough checks that it just didn't do the left-click code if it wasn't done under a certain specific condition.
alex