Почему мой слот не вызывается?

У меня есть этот класс:


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 ответа

Решение

Все классы, которые содержат сигналы или слоты, должны упомянуть Q_OBJECT в начале своего объявления. Они также должны происходить (прямо или косвенно) из QObject.

Попробуйте использовать Q_OBJECT

Пара других возможностей:

1) Объект, от которого вы излучаете сигнал, заблокирован (см. QObject:: blockSignals ())

2) Получатель не имеет привязки к потоку. Если объект потока, в котором был создан получатель, исчезает, а получатель не перемещается в другой поток, он не будет обрабатывать события (слоты являются особым случаем).

Еще одна возможность, которую я потратил около дня, чтобы решить в своем собственном коде:

  • Сигнал определен в суперклассе И его подклассе. Вызов connect() работал с указателем подкласса, но сигнал был передан из кода суперкласса. Решение состояло в том, чтобы удалить объявление сигнала из подкласса, который в любом случае был там по ошибке.
Другие вопросы по тегам