LINUX.ORG.RU

[Qt] Сымитировать нажатие


0

0

Итак, имея свой произвольный виджет и рисуя на нем спрайты, мне нужно изобразить нажатие.

У моего виджета есть булевское поле pushed. В paintEvent в зависимости от этого поля я рисую один спрайт, либо другой. Когда приходит mousePressEvent я присваиваю pushed true. Когда приходит mouseReleaseEvent я присваиваю ему false.

В итоге когда я кликаю на виджет спрайты меняются и выходит обычная анимация.

Но через раз, особенно если кликать быстро, вместо последовательности mousePressEvent и mouseReleaseEvent приходит один последний.

Анимации следовательно нет.

Посоветуйте, каким образом лучше организовать анимацию нажатия? Или как гарантированно получить событие клика?


Ответ на: комментарий от lester_dev

Смотри, по логике, спрайт должен меняться на нажатый, когда вызывается mousePressEvent (т.е. кнопку мыши нажал, но не отпустил). И возвращаться к отжатому должен при вызове mouseReleaseEvent (то есть кнопку мыши отпустил).

Так я и делаю. Но Qt, можно сказать, ведет себя непоследовательно и пропускает mousePressEvent при быстром клике.

Таймер не подходит тем, что юзер может быстро кликнуть и вообще убрать мышку с виджета, а он останется нажатым и только через некоторое время отожмется.

Явно некорректное поведение.

Ведь кнопки Qt без всяких задержек реагируют.

Fredrik ()
Ответ на: комментарий от Fredrik

>Смотри, по логике, спрайт должен меняться на нажатый, когда вызывается mousePressEvent (т.е. кнопку мыши нажал, но не отпустил). И возвращаться к отжатому должен при вызове mouseReleaseEvent (то есть кнопку мыши отпустил).

Эм, анимация из двух кадров чтоли?

lester_dev ★★★★★ ()
Ответ на: комментарий от Fredrik

Ведь кнопки Qt без всяких задержек реагируют.

Так посмотри как они сделаны.
А вообще, покажи свой код.

anonymous ()
Ответ на: комментарий от Fredrik

Во все века это делалось с помощью рампы и таймера.

Анимация нажатия - [|--------]

1. При клике пускаешь анимацию [->------] [-->-----] [--->----]

2. Если при следующем кадре кнопка отжата, то пускаешь назад [---<------] [--<-------] [-<--------] [<---------]

3. Если дошло до конца, то ждешь, пока кнопка не отожмется [--------|] и пускаешь п.2 при отжатии

lester_dev ★★★★★ ()
Ответ на: комментарий от anonymous

Примерно так.

Хедер:

#ifndef GLYPHBUTTON_H
#define GLYPHBUTTON_H

#include <GlyphWidget.h>
#include <QMap>

#include "GraphicWidgets_global.h"

class GRAPHICWIDGETS_EXPORT GlyphButton : public GlyphWidget
{
    Q_OBJECT

public:
    explicit GlyphButton(QWidget *parent = 0);

    const Qt::MouseButtons getPressButtons();
    void setPressButtons(const Qt::MouseButtons buttons);

protected:
    bool pushed;

    Qt::MouseButtons pressButtons;

    void selectNextGlyph();

    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);

};

#endif // GLYPHBUTTON_H

Исходник:

#include "GlyphButton.h"

#include <QApplication>
#include <QStyle>
#include <QMouseEvent>

GlyphButton::GlyphButton(QWidget *parent)
    : GlyphWidget(parent),
    pushed(false),
    pressButtons(Qt::LeftButton)
{

}

void GlyphButton::selectNextGlyph()
{
    if (pushed)
        nextGlyph = ...
    else
        nextGlyph = ...
}

void GlyphButton::mousePressEvent(QMouseEvent *event)
{
    if (pressButtons.testFlag((event->button())))
        pushed = true;

    GlyphWidget::mousePressEvent(event);
    repaint();
}

void GlyphButton::mouseReleaseEvent(QMouseEvent *event)
{
    if (pressButtons.testFlag((event->button())))
        pushed = false;

    GlyphWidget::mouseReleaseEvent(event);
    repaint();
}

const Qt::MouseButtons GlyphButton::getPressButtons()
{
    return pressButtons;
}

void GlyphButton::setPressButtons(const Qt::MouseButtons buttons)
{
    pressButtons = buttons;
}

В paintEvent вызывается selectNextGlyph, и затем он рисуется.

Fredrik ()
Ответ на: комментарий от Yuriy_90

Я не кликаю быстро много раз.

Я держу мышку на виджетом, ничего не нажимаю, потом просто нажимаю кнопку и тут же отпускаю.

mouseDoubleClickEvent е срабатывает - проверял.

Fredrik ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.