Бесконечная рекурсия с Qt-связанным сигналом / слотом - PullRequest
4 голосов
/ 10 апреля 2011

Я думаю, что у меня есть фундаментальное недопонимание того, как работает механизм Qt сигнал / слот.

Я работал с примерами программ, и они имеют смысл, но когда я пытался взять их и изменить их, я получил результаты, которых я не понимаю.Ниже приведен пример кода, который представляет собой упрощенную версию того, что я пытался сделать, что, конечно, не делает то, что я хочу.Я неправильно использую механизм сигнала / слота или класс QString?Способ, которым я использую сигнал / слот, чтобы модифицировать вещи в связанном виде, создавая бесконечный цикл?Любая помощь с благодарностью.

// 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();
}

Ответы [ 2 ]

3 голосов
/ 10 апреля 2011

Поскольку в aChanged вы редактируете b QLineEdit, он запускает сигнал textChanged () для b ..., вызывая его вызов bChanged, изменяя ..... и т. Д. И т. Д.

Я думаю, что это ваша проблема здесь.

Возможно, вы захотите использовать textEdited () вместо.

0 голосов
/ 10 апреля 2011

Не так критично в этом случае, но, пожалуйста, обратите внимание на удаление a_ и b_ в деструкторе, так как у них нет родителя.

...