QGraphicsBlurEffect 调整文本大小但不调整小部件本身

Posted

技术标签:

【中文标题】QGraphicsBlurEffect 调整文本大小但不调整小部件本身【英文标题】:QGraphicsBlurEffect resizes Text but not Widget itself 【发布时间】:2016-01-18 20:14:53 【问题描述】:

我正在尝试在我的项目中使用 Qt 5.5.1 QGraphicsBlurEffect,但无法在 Mac 上运行:

我尝试使用PerformanceHintQualityHintAnimationHint 进行更改,但没有成功。使用QGraphicsColorizeEffect 我遇到了同样的问题,而QGraphicsOpacityEffectQGraphicsDropShadowEffect 以及Linux 上的一切都运行良好:

如何更改我的项目文件或代码以消除此图形问题?有可能吗?

TEMPLATE = app
TARGET = main
QT += widgets
SOURCES += main.cpp

#include <QtWidgets>

int main(int argc, char **argv)

    QApplication app(argc, argv);
    QMainWindow window;

    QTextEdit *text = new QTextEdit;
    text->setReadOnly(true);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(text);

    QWidget *widget = new QWidget;
    widget->setLayout(layout);

    QGraphicsBlurEffect effect;
    effect.setBlurRadius(3);

    QLabel *test = new QLabel("TEST");
    test->setGraphicsEffect(&effect);
    (new QHBoxLayout(text))->addWidget(test, 0, Qt::AlignCenter);

    window.setCentralWidget(widget);
    window.show();
    return app.exec();

【问题讨论】:

您使用的是 HDPI/Retina 显示器吗?看起来字体完全按因子 2 缩放?我的猜测可能是由于没有正确处理视网膜 (devicePixelRatio=2) 引起的错误。 @FrankOsterfeld 我想是的。但QLabel 中的图像也是如此。你知道如何解决这个问题吗? 【参考方案1】:

QGraphicsOpacityEffect 也有类似的问题:文本和图标模糊,但必须清晰锐利。似乎是Qt中的一个错误。我的解决方案是编写我自己的小类,其中包含我需要的所有内容并进行适当的渲染。 好吧,您可以尝试修复 Qt... 祝您阅读图形效果的源代码好运。它的所有 dpr 和变换矩阵以及渲染子小部件都非常复杂。

【讨论】:

我确实已经读过了。你介意在这里分享你的代码吗?也许是可以重现修复的简化版本。 不透明度很容易。因为QPainter 有一个setOpacity() 函数。所以我可以覆盖QWidget::paintEvent() 并使用具有适当不透明度的画家制作我自己的绘画逻辑。您可以通过一些自定义属性更改不透明度并调用QWidget::update()。结果在动画中非常好。恐怕模糊效果不会那么容易解决。

以上是关于QGraphicsBlurEffect 调整文本大小但不调整小部件本身的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 文本空间在调整大小时变小

根据文本大小调整图像大小

根据内容动态调整 HTML 文本输入宽度

如何调整标签的宽度?

UILabel - 自动调整大小标签以适合文本?

根据 UILabel 文本和图像自动调整单元格大小,例如聊天