Qt耦合信号/时隙的无限递归

我想我对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();
}

最佳答案 因为在aChanged中,你编辑了b QLineEdit,它会触发b的textChanged()信号…导致它调用bChanged,改变…..等等.

我认为这是你的问题.

您可能想要使用textEdited().

点赞