Qt5 QWidget:悬停效果延迟

Posted

技术标签:

【中文标题】Qt5 QWidget:悬停效果延迟【英文标题】:Qt5 QWidget :hover effect delay 【发布时间】:2017-10-26 17:46:42 【问题描述】:

我正在尝试使用以下 CSS 在我的 QWidget 上创建任何类型的 :hover 效果:

QWidget.mis--MyButton 
    width: 300px;
    height: 300px;
    background:  white;
    /*cursor: pointer;*/
    font-family: Calibri;
    border-radius: 10px;
    border: 2px solid rgb(218, 218, 218); /*#007FEB;*/

    padding: 1px;
    margin-top: 2px;


QWidget.mis--MyButton:hover 

    border: 2px solid #007FEB; /*#007FEB;*/

但是,从鼠标进入小部件到效果出现的时间,会有 2-3 秒的轻微延迟。

以下是所发生情况的截屏视频:

https://youtu.be/aNfEKabut-A

对于绘画,我使用以下代码:

void MyButton::paintEvent(QPaintEvent * event)
 
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);   
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);


即使我试图摆脱 CSS,即不加载任何 CSS,而只是尝试产生任何效果并使用 Qt 的样式,例如,这样:

style()->drawPrimitive(QStyle::PE_PanelButtonBevel, &opt, &p, this);

只要关闭 CSS,我仍然会遇到同样的延迟。

这是一个相同效果的截屏视频,没有加载 CSS,并且在 paintEvent 中选择了 QStyle::PE_PanelButtonBevel 选项:

https://youtu.be/kT10zdepsGk

计算机相当强大,Windows 10 上的 Ryzen 7,我使用的是 VC++ 2017,所以它不应该与类似的东西相关。

如果您需要更多代码,请告诉我。

谢谢!

【问题讨论】:

1) 您是否尝试分析您的代码? 2) 为什么你不使用 Qt MVC 或 QML 或 Qt 图形场景? 嗯,大部分是因为我不知道它(QML):-) 我会检查一下,几天后看看它是否真的对我有好处。谢谢! 你尝试过使用 jQuery 吗?真的不要听那个人的。您的代码没有问题。我无法在更旧的 Windows 7 机器上使用 MinGW 重现该问题。这也只是标准代码。你可能在调试器中运行程序吗? Qt Creator 中的 CDB 调试器集成有时会非常缓慢。 “计算机相当强大,Windows 10 上的 Ryzen 7,我使用的是 VC++ 2017,所以它不应该与类似的东西相关。”如果您的 CPU 达到 100%,那么您的计算机有多强大并不重要。你的CPU占用等级是多少?您是否内置了 Release 或 Debug?你有调试器吗? @DushanSavich 我不在乎点:),很高兴你解决了你的问题。无论如何,你可以接受一个答案。 【参考方案1】:

对于包含大量项目的快速动画,建议使用 QtQuick/QML 场景。

QSS 很慢,因为它需要大量重新计算并在 CPU 上进行。 QGraphicsScene 工作得更快,但同样 - 它是 CPU 并且需要大量的手工可视化代码。

【讨论】:

以上是关于Qt5 QWidget:悬停效果延迟的主要内容,如果未能解决你的问题,请参考以下文章

委托中的 QWidget:鼠标悬停时不会重绘,因此无法检查 MouseOver 状态

将 QWidget 或其他 QWidget 派生控件添加到 QWindow

创建 QWidget 宽度 HWND 父级

Qt5 QMainWindow使用

QWidget - 从 C++ 代码设置边框

由父级绘制 QWidget