Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ бага в QSlider

Автор: Tux-oid 13.8.2010, 12:13

Код:
main.cpp
#include "progressbar.h"

int main(int argc, char * argv[])

{
    QApplication app(argc, argv);
    ProgressBar *m_slider = new ProgressBar (Qt::Horizontal);
    m_slider->show();
    return app.exec();
}


progressbar.cpp
#include "progressbar.h"

ProgressBar::ProgressBar(Qt::Orientation orientation, QWidget *parent) :
    QSlider(parent)
{
    setOrientation(orientation);
}

void ProgressBar::mouseReleaseEvent (QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        event->ignore();
        double k = ((double)event->x())/((double)width());
        int a = k*(maximum());
        setValue(a);
    }
}


progressbar.h
#ifndef PROGRESSBAR_H
#define PROGRESSBAR_H

class QMouseEvent;

class ProgressBar : public QSlider
{
Q_OBJECT

public:
    explicit ProgressBar(Qt::Orientation, QWidget *parent = 0);

signals:
    void pbValueChanged(int);

protected:
    void mouseReleaseEvent ( QMouseEvent* event );
};

#endif // PROGRESSBAR_H


slider.pro
SOURCES +=  \
    main.cpp \
    progressbar.cpp

HEADERS += \
    progressbar.h


при клике по слайдеру он потихоньку доходит до конца. Это что бага Куте, или я чего-то не понимаю?

Автор: Алексей1153 13.8.2010, 12:19

наверное, рекурсия в слоте

void ProgressBar::mouseReleaseEvent (QMouseEvent* event)

Автор: Tux-oid 13.8.2010, 12:23

Нет. Event вызывается лишь раз.

Автор: Алексей1153 13.8.2010, 12:25

class ProgressBar: ...
{
   bool m_bMouseEventInProcess;
};


ProgressBar::ProgressBar(...):...
{
   m_bMouseEventInProcess=false;
}

void ProgressBar::mouseReleaseEvent (QMouseEvent* event)
{
        if(m_bMouseEventInProcess)return;
        m_bMouseEventInProcess=true;

        if (event->button() == Qt::LeftButton)
        {
            ...
        }

        m_bMouseEventInProcess=false;

}


только не забывать, что код должен пройти через сброс флага, и то вернёшься return'ом - и сообщения больше не обработаются. Либо делать оболочку для флага

Автор: Алексей1153 13.8.2010, 13:39

Форум был недоступен, когда я понял, что я понял не то )) Рекурсии неоткуда взяться в показанном коде, но она всё же имеется где-то

Автор: Tux-oid 13.8.2010, 14:07

Похоже это бага Qt. Такое наблюдается только в Qt 4.6.3 на линуксе. В Qt 4.5.0 на винде такого не наблюдается.

Кто-нибудь может проверить?

Автор: DEADHUNT 13.8.2010, 14:50

Цитата(Tux-oid @ 13.8.2010, 15:07) *
Кто-нибудь может проверить?

собери исходники в архив, попробую в линуксе с Qt 4.6.3

Автор: Tux-oid 13.8.2010, 14:56

http://slil.ru/29559702

Автор: DEADHUNT 13.8.2010, 15:02

всё правильно работает, только если щёлкнуть в какое нибудь место он передвигается, потом примерно через секунду ещё немного передвигается(выравнивается относительно мыши).

Автор: molchanoviv 13.8.2010, 15:18

Qt 4.6.3 + Linux openSuSE. Бага есть. Ползунок сперва перемещается к месту клика, а затем уходит к краю.

Автор: Litkevich Yuriy 13.8.2010, 15:31

Tux-oid, при создании сообщения подчищай код, чтобы он был более компактен, старайся сводить к минимуму пустые строки.
По оформлению сообщений читай тут: http://www.forum.crossplatform.ru/index.php?showtopic=1455

Автор: Алексей1153 13.8.2010, 16:04

WXP SP3
Qt 4.7.0
- такая же фигня, ползунок выравнивается слева от курсора после окончания движения. Но не уползает никуда - один раз дёрнулся и всё

Автор: Litkevich Yuriy 14.8.2010, 19:55

тему разделил: http://www.forum.crossplatform.ru/index.php?showtopic=5412

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)