未调用 QLineEdit textChanged 信号
QLineEdit textChanged signal not called
我想将 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
}
我做错了什么?
如果连接出现问题,旧样式通常会在 console/terminal 中写入调试消息。由于您没有控制台,我强烈建议您立即停止使用 old 风格的信号和槽,并使用使用现代函数绑定的新形式:
connect(nameEdit, &QLineEdit::textChanged, this, &Dialog::nameChanged);
试试这个,看看它是否编译。如果没有,则意味着 signals/slots 之一已过载,在这种情况下,您需要静态转换为要连接的过载。编译错误的另一个原因是您的连接不兼容。
优点:
- 一旦编译,它就可以工作了
- 它是在编译时解析的,而不是 运行 时,所以速度更快
- 它不使用字符串来解析函数名称
PS:为了全面披露,这家伙将 nameChanged()
作为 public 插槽(检查他的编辑),然后他将其更改为信号...不知道那里发生了什么。
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog();
virtual ~Dialog();
QLineEdit *nameEdit;
signals:
void nameChanged(const QString &);
};
您想使用 nameChanged() 作为 slot 而不是 signal
所以正确的方法是:
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog();
virtual ~Dialog();
QLineEdit *nameEdit;
public slots:
void nameChanged(const QString &);
};
我想将 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
}
我做错了什么?
如果连接出现问题,旧样式通常会在 console/terminal 中写入调试消息。由于您没有控制台,我强烈建议您立即停止使用 old 风格的信号和槽,并使用使用现代函数绑定的新形式:
connect(nameEdit, &QLineEdit::textChanged, this, &Dialog::nameChanged);
试试这个,看看它是否编译。如果没有,则意味着 signals/slots 之一已过载,在这种情况下,您需要静态转换为要连接的过载。编译错误的另一个原因是您的连接不兼容。
优点:
- 一旦编译,它就可以工作了
- 它是在编译时解析的,而不是 运行 时,所以速度更快
- 它不使用字符串来解析函数名称
PS:为了全面披露,这家伙将 nameChanged()
作为 public 插槽(检查他的编辑),然后他将其更改为信号...不知道那里发生了什么。
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog();
virtual ~Dialog();
QLineEdit *nameEdit;
signals:
void nameChanged(const QString &);
};
您想使用 nameChanged() 作为 slot 而不是 signal
所以正确的方法是:
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog();
virtual ~Dialog();
QLineEdit *nameEdit;
public slots:
void nameChanged(const QString &);
};