【问题标题】:Is it possible to set global QPainter default render hints?是否可以设置全局 QPainter 默认渲染提示?
【发布时间】:2015-08-31 13:05:25
【问题描述】:

QPainter 创建时,它有一些默认的渲染提示。一些小部件在绘制自己时会覆盖它们。是否可以覆盖这些默认值禁用整个应用程序的每个小部件覆盖?

我想按如下方式覆盖默认值,并使所有小部件类都遵循这些:

painter->setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing, false);
painter->setRenderHints(QPainter::TextAntialiasing , true);

有可能吗?

更新:

简短的回答:不改变 Qt 源代码是不可能的。

【问题讨论】:

  • 您可以继承 QPainter 并将该代码放入构造函数中
  • 1.这是不可能的,因为构造函数中不存在 QPainter 的对象。 2. 我需要为所有小部件重新定义这些标志。
  • 我的意思是在子类QPainter构造函数中
  • 鉴于这些提示仅对几个小部件真正产生影响,因此全局更改并不是真正必要的。这是您自己的小部件和QGraphicsView 所需要的,仅此而已。
  • @KubaOber 例如,我使用 QTextBrowser。这些提示真的改变了线条和图像的想象。

标签: c++ qt rendering qt5 qpainter


【解决方案1】:

不幸的是,Qt 没有实现任何公开的方式。

有两个问题:

  1. 默认渲染提示 - QPainter::TextAntialiasingQPainter::begin(QPaintDevice*) 中设置。根据您的问题,这正是您想要的,但是

  2. 小部件可以随意覆盖这些默认值。他们中的许多人都这样做。如果不插入会拦截这些并忽略它们的 shim Paint 引擎(或类似引擎),则无法禁用它。

更改它的最简单方法是修改QPainter::setRenderHintQPainter::setRenderHints 以禁用某些小部件类型的覆盖,并重建Qt。无论如何,在任何专业环境中,您都将使用自己构建的 Qt,所以这应该不是问题。

可能有一种方法可以使用 Qt 的私有头文件来连接它,最有可能的是通过提供一个 shim 绘制引擎并将其在后备存储中交换出来,而不修改 Qt 本身,但这会很混乱而且不值得。

【讨论】:

  • 在您的情况下也存在问题,该小部件可以重新定义paintEvent中的渲染命中标志,例如QTextBrowser。
  • 对不起,我的意思是 QTextDocumentLayout - github.com/Vitallium/qt5/blob/master/qtbase/src/gui/text/…
  • @Milovidow 哎呀,对不起,我弄错了(复数 setRenderHints 而不是 setRenderHint)。正如您从代码中知道的那样,现在有一种方法可以覆盖这些,而无需深入研究 Qt 的内部结构......
【解决方案2】:

您可以将QPainter 子类化为:

class MyQPainter: public QWidget
{
    Q_OBJECT;
    public:
        MyQPainter(QWidget *parent = 0);
        QPainter painter;
}

和:

MyQPainter::MyQPainter(QWidget *parent)
    : QWidget(parent)
{
    painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing, false);
    painter.setRenderHints(QPainter::TextAntialiasing , true);
}

现在,你可以声明MyQPainter *pPainter = new MyQPainter();

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 2019-05-22
    • 2019-08-24
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多