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

时间:2011-04-09 22:47:59

标签: qt qt4 signals-slots

我认为我对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 个答案:

答案 0 :(得分:3)

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

我认为这是你的问题。

您可能想要使用textEdited()

答案 1 :(得分:-1)

在这种情况下不是那么重要,但请注意删除析构函数中的a_和b_,因为它们没有任何父级。