Qt耦合信号/槽的无限递归

Qt耦合信号/槽的无限递归,qt,qt4,signals-slots,Qt,Qt4,Signals Slots,我想我对Qt信号/插槽机制的工作原理有一些基本的误解 我已经通过示例程序工作过,它们是有意义的,但是当我尝试采用这些程序并修改它们时,我得到的结果我不理解。我在下面附上了一个代码示例,它是我试图做的事情的一个简化版本,但它肯定没有达到我想要的效果。我是否误用了信号/插槽机制或QString类?我使用信号/插槽以耦合方式修改东西的方式是否创建了一个无限循环?非常感谢您的帮助 // test.cpp #include <QApplication> #include <QDialog

我想我对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();
}
//test.cpp
#包括
#包括
#包括
#包括
#包括
类myDialog:公共QDialog
{
Q_对象
公众:
myDialog():a_u3;(新QLineEdit),b_3;(新QLineEdit)
{
QVBoxLayout*布局(新的QVBoxLayout(本));
布局->添加窗口小部件(a_389;);
布局->添加小部件(b_);
连接(a_u3;,信号(文本已更改(常量QString&)),
这个插槽(改变了(常量QString&));
连接(b_,信号(textChanged(const QString&)),
这个插槽(b已更改(const QString&));
}
私人:
QLineEdit*a;
QLineEdit*b_;
专用插槽:
无效更改(常量字符串和常量);
无效B变更(常数Q字符串和Q);
};
#包括“test.moc”
void myDialog::aChanged(常量QString&qs)
{
b->setText(QString::number(2.0*qs.toDouble());
}
void myDialog::b已更改(常量QString&qs)
{
a->setText(QString::number(3.3*qs.toDouble());
}
int main(int argc,字符**argv)
{
质量保证申请a(argc、argv);
Myd;
d、 show();
返回a.exec();
}

因为在a更改中,您编辑b QLineEdit,它会触发b的textChanged()信号…导致它调用b更改,更改a。。。。。等等等等

我想这是你的问题


您可能希望使用代替。

在这种情况下不太重要,但请注意在析构函数中删除a_u和b_u,因为它们没有任何父级。

我想这可能是造成问题的原因。如果是这样的话,您如何实现将“b”的值仅更改一次以更改为“a”?使用textEdited()信号而不是textChanged()。@bpw1621虽然技术上已经解释了您的问题,但您的代码在概念上似乎仍然错误,仅切换到textEdited可能会隐藏错误。似乎您希望
b
始终包含一个是
a
中数字2.0倍的数字,您希望
a
始终包含一个是
b
中数字3.3倍的数字,这是不可能的。是的,我也注意到了这一点,但假设这只是一个快速测试,以清楚地看到所调用的方法之间的差异。通常应该有一个适当的关系。(如果只是一个测试,我会想到Celcius/Farenheit转换)@Friend Pal Bart说得对,这只是一个简单的例子:实际应用程序在地心坐标和大地坐标框架之间进行坐标转换,但我认为代码的数学性会掩盖真正的问题。感谢您的输入。从关于addWidget的文档中:项目的所有权转移到版面,版面负责删除它。