为什么我的插槽没有被调用?

时间:2010-06-10 02:27:46

标签: c++ qt signals-slots qtextedit qgadget

我有这堂课:


class CustomEdit : public QTextEdit
{
    Q_GADGET

public:
    CustomEdit(QWidget* parent);

public slots:
    void onTextChanged ();
};


CustomEdit::CustomEdit(QWidget* parent)
    : QTextEdit(parent)
{
    connect( this, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
}


void CustomEdit::onTextChanged ()
{
    // ... do stuff
}


当我在编辑控件中输入文本时,永远不会调用onTextChanged方法 我错过了什么?

3 个答案:

答案 0 :(得分:1)

所有包含信号或槽的类必须在声明的顶部提及Q_OBJECT。它们还必须(直接或间接)从QObject派生。

尝试使用Q_OBJECT

答案 1 :(得分:1)

其他几种可能性:

1)阻止发出信号的对象(参见QObject :: blockSignals())

2)接收者没有线程亲和力。如果创建接收器的线程对象消失而接收器没有移动到另一个线程,它将不处理事件(插槽是特殊情况)。

答案 2 :(得分:1)

我在一段时间内用自己的代码解决了一天的另一种可能性:

  • 信号在超类及其子类中定义。 connect()调用是在子类指针上运行的,但信号是从超类代码发出的。解决方案是从子类中删除信号声明,无论如何都是错误的。