使用Qt耦合的信号/槽导致无限递归

4
我认为我对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个回答

4
因为在aChanged中,您编辑了b QLineEdit,这会触发b的textChanged()信号...导致它调用bChanged,从而改变a.....等等。
我认为这就是您在这里遇到的问题。
您可能想使用textEdited()代替。

我认为这可能会引起问题。如果是这样,你如何实现仅在更改“a”的值时仅更改“b”的值一次? - bpw1621
1
使用textEdited()信号而不是textChanged()。 - Bart
1
@bpw1621 虽然从技术上讲你的问题已经被解释了,但是你的代码在概念上似乎仍然存在问题,仅仅切换到textEdited可能会隐藏错误。看起来你想让b始终包含一个数字,该数字是a中数字的2.0倍,并且你希望a始终包含一个数字,该数字是b中数字的3.3倍,这是不可能的。 - rohanpm
是的,我也注意到了,但我认为这只是一个快速测试,以清楚地看到调用方法之间的差别。通常应该有适当的关系。(如果这只是一个测试,那么摄氏度/华氏度转换就会出现在脑海中) - Bart
@朋友Bart是对的,这只是一个简单的例子:真正的应用程序需要在地心和大地坐标系之间进行坐标转换,但我认为代码中的数学性质会掩盖真正的问题。感谢您的意见。 - bpw1621

-1

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


2
从addWidget的文档中可以看到:item的所有权被转移给布局,由布局负责删除它。 - atamanroman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接