Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的Qt小部件';谁的焦点在改变?_C++_Qt - Fatal编程技术网

C++ 为什么我的Qt小部件';谁的焦点在改变?

C++ 为什么我的Qt小部件';谁的焦点在改变?,c++,qt,C++,Qt,我基本上有一个函数,用于检查lineEdit的焦点输入/输出。从这里开始,它会制作一个文本动画,使输入看起来像“谷歌”风格。下面是函数: QParallelAnimationGroup *group = new QParallelAnimationGroup; QPropertyAnimation *posAnimation = new QPropertyAnimation(label, "pos"); posAnimation->setStartValue(QPoint(0, 0));

我基本上有一个函数,用于检查lineEdit的焦点输入/输出。从这里开始,它会制作一个文本动画,使输入看起来像“谷歌”风格。下面是函数:

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);
唯一的问题是 从一条线编辑到另一条线编辑时,焦点会离开第一条线(这很好),然后转到第二条线,但也会很快离开第二条线

不知道为什么会发生这种情况,但它使我的动画毫无价值

我将Qt5.9IDE与C一起使用++

编辑:为了获得自定义属性,我对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链接:

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

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

解决方案:我建议您在
GFrame::eventFilter
中注释对
GFrame::update
的两个调用。那么它应该像你期望的那样工作


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

在调查问题原因时,我建议您先尝试不使用动画,然后使用qDebug获取事件顺序。我可以和您一起搜索原因,但您共享的代码对我的搜索没有多大帮助。@scopchanov我现在将代码添加到GitHub。@scopchanov我已经编辑了这篇文章,以获得指向整个源代码的链接。好的,我会在有时间时看一看。第一印象(在x64、Windows 7、Qt 5.9、MSVC2017上)-多个线编辑同时具有焦点。我正在进一步搜索。我能做些什么来允许调用
setMinimumSize
让我试试,然后我会给你回复结果。好的,单独调用
setMinimumSize
不会导致焦点被盗。单独调用
adjustSize
也不会导致焦点被盗。恐怕我不同意你的看法。在
GFrame::eventFilter
中,注释对
update
的两个调用,它将按预期工作。然后将它们替换为调用
adjustSize
,问题又出现了。