为什么我的Qt小部件焦点会改变?

3

我基本上有一个函数来检查lineEdit的焦点。从这里开始,它进行文本动画,使输入看起来像“Google”风格。以下是该函数:

QParallelAnimationGroup *group = new QParallelAnimationGroup;

QPropertyAnimation *posAnimation = new QPropertyAnimation(label, "pos");
posAnimation->setStartValue(QPoint(0, 0));
posAnimation->setEndValue(QPoint(5, 5));
group->addAnimation(posAnimation);

QPropertyAnimation *sizeAnimation = new QPropertyAnimation(label, "size");
sizeAnimation->setStartValue(label->size());
sizeAnimation->setEndValue(QSize(QFontMetrics(pix16).width(label->text()), QFontMetrics(pix16).height()));
group->addAnimation(sizeAnimation);

QPropertyAnimation *fontAnimation = new QPropertyAnimation(label, "fontPixelSize");
fontAnimation->setStartValue(12);
fontAnimation->setEndValue(16);
group->addAnimation(fontAnimation);

group->start(QAbstractAnimation::DeleteWhenStopped);

label->setAttribute(Qt::WA_TransparentForMouseEvents);

updateRect();
return lineEdit->eventFilter(watched, event);

唯一的问题是,当从一个lineEdit点击到另一个时,焦点会从第一个转移走(这很好),然后它会转移到第二个,但很快也会离开第二个。
不确定为什么会出现这种情况,但它使我的动画变得毫无价值。
我正在使用带有C ++的Qt 5.9 IDE。
编辑:我对QLabel进行了子类化以获取自定义属性:
class Label: public QLabel {
    Q_OBJECT
    Q_PROPERTY (double fontPixelSize READ fontPixelSize WRITE setFontPixelSize)

public:
    Label(QWidget* parent = 0): QLabel(parent)
    {

    }
    double fontPixelSize() const
    {
        return font().pixelSize();
    }
    Q_SLOT void setFontPixelSize(int size)
    {
        QFont f = font();
        f.setPixelSize(size);
        setFont(f);
    }
};

编辑:添加了GitHub链接:这里

在调查问题原因时,我建议您首先尝试不使用动画,并使用QDebug获取事件顺序。我可以加入您寻找原因的搜索中,但是您分享的代码并没有帮助我能够做到这一点。 - scopchanov
@scopchanov 我现在会把代码上传到GitHub上。 - Nicholas Johnson
@scopchanov,我已经编辑了帖子,加入了整个源代码的链接。 - Nicholas Johnson
好的,我有时间时会看一下。 - scopchanov
第一印象(在x64、Windows 7、Qt 5.9、MSVC2017上)-几个LineEdits同时具有焦点。我正在进一步搜索。 - scopchanov
1个回答

1

在检查链接中的代码后,我发现以下内容:

问题:GFrame::updateRect方法中,至少调用QWidget::adjustSize会导致焦点从QLineEdit上被窃取。可能setMinimumSize也与此有关,但我没有测试过。

解决方案:我建议您在GFrame::eventFilter中注释掉对GFrame::updateRect的两个调用。然后它应该按您的预期工作。

进一步建议:您还可以在GFrame::eventFilter中注释掉对QLineEdit::setFocus的调用,因为它们是不必要的。


我该怎么做才能允许调用setMinimumSize函数? - Nicholas Johnson
当取消对adjustSize调用的注释并注释对updateRect调用的注释时,问题仍然发生。 - Nicholas Johnson
我必须承认你是对的。看来当GFrame因为某种原因被调整大小时,焦点会从QLineEdit中移走。我会尝试想出一个解决办法。 - scopchanov
@Nicholas Johnson,请告诉我您是否满意所提出的重新设计方案。 - scopchanov
@Nicholas Johnson,太棒了! - scopchanov
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接