【问题标题】:QLineEdit textChanged signal not called未调用 QLineEdit textChanged 信号
【发布时间】:2017-04-04 05:33:50
【问题描述】:

我想将 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
}

我做错了什么?

【问题讨论】:

  • 它启动时是否给出调试消息,表明信号/插槽不可用?查看您的控制台/终端。
  • 它实际上是我正在编写的 Maya 插件的一部分,因此无法访问 Qt 控制台。
  • 你的 nameChanged() 函数是否标记为插槽?
  • 为什么nameChanged 在信号下?它应该是一个插槽。
  • 顺便说一句,nameEdit=new QLineEdit( ---> this <--- );

标签: c++ qt qt-signals


【解决方案1】:

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

connect(nameEdit, &QLineEdit::textChanged, this, &Dialog::nameChanged);

试试这个,看看它是否可以编译。如果没有,则意味着其中一个信号/插槽已过载,在这种情况下,您需要静态转换为要连接的过载。编译错误的另一个原因是您的连接不兼容。

优点:

  1. 一旦编译,它就可以工作了
  2. 它是在编译时解决的,而不是在运行时解决的,所以速度更快
  3. 它不使用字符串来解析函数名

PS:为了全面披露,这家伙将 nameChanged() 作为公共插槽(检查他的编辑),他将其更改为信号......不知道那里发生了什么。

【讨论】:

    【解决方案2】:
    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 &);
    };
    

    【讨论】:

    • 插槽 nameChanged 可能会超载,因此您需要强制转换插槽,并且您可以跳过公共插槽中的“公共”,因为它立即位于“公共”块下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多