Почему мой слот не вызывается?
У меня есть этот класс:
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() работал с указателем подкласса, но сигнал был передан из кода суперкласса. Решение состояло в том, чтобы удалить объявление сигнала из подкласса, который в любом случае был там по ошибке.