scopchanov
scopchanov

Reputation: 8419

How to recognize the type of a click on a QWidget

Using the mouse events of QWidget it is possible to catch the user's interaction with the widget. However, Qt does not deliver only the resulting action (a click or a double click), but provides the whole sequence of events as it is. Thus, the action should be recognized manually and my question is: How? QMouseEvent::flags() doesn't help much, since the only flag Qt::MouseEventCreatedDoubleClick is never set, as reported here.

In other words, how to properly emit those two signals, defined in the header file of MyWidget (derived from QWidget):

void clicked();
void doubleClicked();

having those slots:

void MyWidget::mousePressEvent(QMouseEvent *event)
{
    ...
}

void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
    ...
}

void MyWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
    ...
}

By properly I mean that if the user double clicks MyWidget only MyWidget::doubleClicked should be emited instead of MyWidget::clicked followed by MyWidget::doubleClicked;

Upvotes: 1

Views: 1731

Answers (1)

JazzSoft
JazzSoft

Reputation: 426

I met the same problem before. I think it is by design of Qt. This may not be a best solution, but what you can do is to create an event filter and 'wait' for a while:

bool m_bClicked = false;

bool eventFilter(QObject* object, QEvent* event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        // Wait for 400 milliseconds
        m_bClicked = true;
        QTimer::singleShot(400, this, SLOT(eventMousePressTimer()));
        return true;
    }
    else if(event->type() == QEvent::MouseButtonDblClick)
    {
        // Double-clicked
        m_bClicked = false;
        return true;
    }
    return false;
}

void eventMousePressTimer()
{
    if(m_bClicked)
    {
        // Single-clicked
    }
}

Upvotes: 2

Related Questions