检测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());
    }
}

我做错了什么?


更新:

感谢 Stuart 建议对 QPlainTextEdit 进行子类运算,并将 focusOutEvent() 函数放在那里。 这被称为,但现在我看到

  1. e->lostFocus() 为获得和失去焦点返回 true。
  2. 我连接到doneEdit信号的插槽不会被调用。

好的,我现在明白了:

  1. Stuart 建议对QPlainTextEdit进行子类化并将 focusOutEvent() 函数放在那里,但是:
    • e->lostFocus()无论是获得还是失去焦点,都回到了真实。
    • 我连接到该信号的插槽没有被调用。
  2. 我在查看我的connect()函数时注意到Qt Creator的自动完成功能将const QStringList&类型转换为QStringList。 修复了插槽

知何故,经过一些更不相关的重新排列,我只在焦点丢失时发出信号,就像它应该的那样,而不是失去和获得。 我不知道这是如何或何时发生的。

相关内容

最新更新