Надежный способ определить, когда QWidget теряет фокус?

Сначала это может показаться дубликатом этот вопрос, но решение не работает для меня. Похоже, я все делаю правильно, но я не достигаю точки останова в начале LabelledTextEdit :: focusOutEvent ():

class LabelledTextEdit : public QWidget
{
Q_OBJECT
public:
explicit LabelledTextEdit(QString label, int labelheight, int left, int top, int width, int height, QWidget* parent = 0);
const QStringList getLines() const;
QLabel* label;
QPlainTextEdit* text;

protected:
void focusOutEvent(QFocusEvent* e) override;

signals:
void doneEditing(const QStringList& lines);
};LabelledTextEdit::LabelledTextEdit(QString labeltext, int labelheight, int left, int top, int width, int height, QWidget* parent) :
QWidget(parent)
{
setGeometry(left, top, width, height);
setFocusPolicy(Qt::StrongFocus);

label = new QLabel(labeltext, this);
//continue setting up label
label->setGeometry(
0,              //Left
0,              //Top
width,          //Width
labelheight     //Height
);
text = new QPlainTextEdit(this);
//continue setting up text
text->setGeometry(
0,                      //Left
labelheight,            //Top
width,                  //Width
height - labelheight    //Height
);
}

const QStringList LabelledTextEdit::getLines() const
{
return text->toPlainText().split('\n', QString::SplitBehavior::KeepEmptyParts);
}

void LabelledTextEdit::focusOutEvent(QFocusEvent* e)
{
QWidget::focusOutEvent(e);  //breakpoint here is not hit
if(e->lostFocus())
{
emit doneEditing(getLines());
}
}

Что я делаю неправильно?


Обновить:

Спасибо Стюарту за предложение создать подкласс QPlainTextEdit и поместить туда функцию focusOutEvent (). Это называется, но теперь я вижу, что

  1. e-> lostFocus () возвращает true как для получения, так и для потери фокуса.
  2. Слоты, которые я подключаю к сигналу doneEditing, не вызываются.

0

Решение

Хорошо, я понял это сейчас:

  1. Предложение Стюарта подклассу QPlainTextEdit и положить focusOutEvent() функция там называется, но:
    • e->lostFocus() вернул true как для получения, так и для потери фокуса.
    • Слоты, которые я подключил к этому сигналу, не назывались.
  2. Я заметил, рассматривая мой connect() функции, которые автозаполнение Qt Creator преобразовал const QStringList& введите в QStringList, Исправление вызвало слоты.

И каким-то образом, после некоторой не связанной перестановки, я только излучаю сигнал о потерянном фокусе, как и положено, вместо того, чтобы и потерять, и получить. Я понятия не имею, как и когда это произошло.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]