Search code examples
qtqt4signals-slots

Infinite recursion with Qt coupled signal/slot


I think I have some fundamental misunderstanding of how the Qt signal/slot mechanism works.

I have worked through example programs and they make sense but when I've tried to take those and modify them I have been getting results I do not understand. I have attach a code sample below that is a boiled-down version of what I was trying to do that certainly does not do what I want it to. Am I misusing the signal/slot mechanism and or the QString class? Is the way I am using the signal/slot to modify things in a coupled fashion creating an infinite loop? Any help greatly appreciated.

// test.cpp
#include <QApplication>
#include <QDialog>
#include <QLineEdit>
#include <QString>
#include <QVBoxLayout>

class myDialog : public QDialog
{
    Q_OBJECT

    public:
      myDialog() : a_( new QLineEdit ), b_( new QLineEdit )
      {
        QVBoxLayout* layout( new QVBoxLayout( this ) );
        layout->addWidget( a_ );
        layout->addWidget( b_ );

        connect( a_, SIGNAL( textChanged( const QString& ) ),
                 this, SLOT( aChanged( const QString& ) ) );
        connect( b_, SIGNAL( textChanged( const QString& ) ),
                 this, SLOT( bChanged( const QString& ) ) );
    }

    private:
      QLineEdit* a_;
      QLineEdit* b_;

    private slots:
      void aChanged( const QString& qs );
      void bChanged( const QString& qs );    
};
#include "test.moc"

void myDialog::aChanged( const QString& qs )
{
  b_->setText( QString::number( 2.0 * qs.toDouble() ) );
}

void myDialog::bChanged( const QString& qs )
{
  a_->setText( QString::number( 3.3 * qs.toDouble() ) );
}

int main( int argc, char** argv )
{
    QApplication a( argc, argv );
    myDialog d;
    d.show();

    return a.exec();
}

Solution

  • Because In aChanged, you edit the b QLineEdit, it triggers the textChanged() signal for b...causing it to call bChanged, changing a..... etc. etc.

    I think that is your problem here.

    You might want to use textEdited() in stead.