C++ 未调用QLineEdit textChanged信号

C++ 未调用QLineEdit textChanged信号,c++,qt,qt-signals,C++,Qt,Qt Signals,我想将textChanged信号连接到QLineEdit,但它从未被调用: class Dialog : public QDialog { Q_OBJECT public: Dialog(); virtual ~Dialog(); QLineEdit *nameEdit; public slot: void nameChanged(const QString &); }; .c文件: Dialog::Dialog() { nameE

我想将textChanged信号连接到QLineEdit,但它从未被调用:

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog();
    virtual ~Dialog();
    QLineEdit *nameEdit;

public slot:
    void nameChanged(const QString &);
};
.c文件:

Dialog::Dialog()
{

    nameEdit=new QLineEdit;
    connect(nameEdit, SIGNAL(textChanged(const QString &)), this, SLOT(nameChanged(const QString &)));
    ...
}

void Dialog::nameChanged(const QString & txt)
{
// NEVER CALLED
}

我做错了什么?

如果连接出现问题,旧样式通常会在控制台/终端中写入调试消息。由于您没有控制台,我强烈建议您立即停止使用老式的信号和插槽,并使用使用现代函数绑定的新形式:

connect(nameEdit, &QLineEdit::textChanged, this, &Dialog::nameChanged);
试试这个,看看它是否编译。如果没有,则意味着其中一个信号/插槽过载,在这种情况下,您需要静态地强制转换到要连接的重载。编译错误的另一个原因是您的连接不兼容

优点:

  • 一旦编译完成,它就可以工作了
  • 它是在编译时解决的,而不是在运行时解决的,因此速度更快
  • 它不使用字符串来解析函数名
  • PS:为了充分披露,这家伙把
    nameChanged()
    作为一个公共槽(检查他的编辑),他把它改成了一个信号。。。不知道那里发生了什么

    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        Dialog();
        virtual ~Dialog();
        QLineEdit *nameEdit;
    
    signals:
        void nameChanged(const QString &);
    };
    
    您希望将nameChanged()用作插槽,而不是信号

    因此,正确的方法是:

    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        Dialog();
        virtual ~Dialog();
        QLineEdit *nameEdit;
    
    public slots:
        void nameChanged(const QString &);
    };
    

    当它启动信号/插槽不可用时,是否给出调试消息?查看您的控制台/终端。它实际上是我正在编写的maya插件的一部分,因此无法访问Qt控制台。您的nameChanged()函数是否标记为插槽?为什么在信号下
    nameChanged
    ?它应该是一个插槽。顺便说一句,
    nameEdit=new QLineEdit(--->此插槽名称更改可能会过载,因此您需要强制转换插槽,您可以跳过公共插槽中的“public”,因为它位于“public”块下。