[Qt-interest] strange behavior of spinbox when sleeping (Linux only)

TP paratribulations at free.fr
Sat Nov 20 16:28:28 CET 2010


Hello,

I obtain a strange behavior of QSpinBox when connecting its "valueChanged( 
int )" signal to a method that "sleeps" for some time: for one click on the 
increase and decrease arrows of the spinbox, the method is called two times 
instead of one, and the spinbox number is incremented or decremented by two 
units instead of one. Strangely, when using keyboard arrows, the problem 
disappears.
When using a for loop (see commented code) instead of a sleep(), the problem 
disappears too.

I have obtained this with Qt C++, PyQt, and PySide on Linux.
I have not been able to reproduce it with PyQt on Windows (I have not tested 
the C++ and PySide version on Windows).
So this problem seems to appear only on Linux.
My Qt version: 4.6.2.

Can you reproduce this behavior on Linux?
Have I to enter a bug report?

Additional question: what is the origin of the sleep() function used below? 
I am not familiar to C++. Is it the POSIX thread library (available only on 
Linux: "man pthreads")?

Julien

//// spinbox.hpp
#include <QtGui>
#include <QtCore>

class MyObject: public QObject
{
    Q_OBJECT

    public slots:
        void wait_a_moment( void );
};

//// spinbox.cpp
#include "spinbox.hpp"

void MyObject::wait_a_moment( void )
{
    qDebug() << "calculation begin";
    sleep( 1 );
    // for ( int i=0; i<100000000; i++ )
    // {
    // if ( i%10000000 == 0 )
    // qDebug() << i;
    // }
    qDebug() << "calculation end";
}

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

    QApplication app( argc, argv );

    MyObject * myobject_instance = new MyObject();

    QDialog * dialog = new QDialog();
    dialog->resize( 750, 550 );

    QSpinBox * spinbox = new QSpinBox( dialog );
    QObject::connect( spinbox
            , SIGNAL( valueChanged( int ) )
            , myobject_instance
            , SLOT( wait_a_moment() ) );

    QVBoxLayout * vboxlayout = new QVBoxLayout( dialog );
    dialog->setLayout( vboxlayout );
    dialog->show();

    app.exec();
}

//// spinbox.pro 
HEADERS += spinbox.hpp
SOURCES += spinbox.cpp


//// Compilation
$ qmake
$ make


-- 
python -c "print ''.join([chr(154 - ord(c)) for c in '*9(9&(18%.\
9&1+,\'Z4(55l4('])"

"When a distinguished but elderly scientist states that something is
possible, he is almost certainly right. When he states that something is
impossible, he is very probably wrong." (first law of AC Clarke)




More information about the Qt-interest-old mailing list