【问题标题】:Painting with rotated QPainter clips to incorrect region of QImage使用旋转的 QPainter 剪辑绘画到 QImage 的不正确区域
【发布时间】:2017-04-24 15:28:43
【问题描述】:

我有一个代表一张空白纸的 QImage 和一个用于在此图像上绘画的 QPainter。 有时,我想在任何绘制操作之前旋转/平移 QPainter,以便以“横向”方向绘制到此图像上。

这里是简化的sn-p代码:

_image = new QImage(paperRect().size(), QImage::Format_RGB888);
_painter->begin(_image);

if (_orientation == QPrinter::Landscape)
{
    _painter->translate(0, _image->height());
    _painter->rotate(270);
}

// Painting operations here.

不幸的是,这并没有像我预期的那样工作。似乎即使画家已旋转,它也不知道它可以在其中绘制的“新”边界,从而裁剪为“纵向”大小。

我尝试了以下方法无济于事:关闭剪辑(_painter->setClipping(false);),设置新的剪辑矩形(_painter->setClipRect(0, 0, _image.height(), _image.width());),并以各种方式调整窗口和视口。

我查看了 QPainter 和 QImage 的文档,并搜索了互联网,但我还没有发现之前讨论过的这个特定问题。

【问题讨论】:

  • 好像你遇到了 Qt 错误。
  • 一个错误意味着现有代码存在问题,这看起来更像是代码中缺少场景考虑。
  • paperRect().size() 的值是什么?如果它仍然设置为纵向格式(例如 A4 为 210x294 毫米),那就可以解释很多了。
  • @JvO paperRect() 的值取决于所选纸张的大小和打印机的分辨率,并且绝对 取决于所选的方向,因为我正在绘图侧身到这张图片上。显然,我对“方向”和“景观”这两个术语的使用让一些人感到困惑,而我只是想用这些术语来帮助说明问题。

标签: c++ qt paint qpainter qimage


【解决方案1】:

事实证明,问题与我发布的代码无关。这是我的解决方案,以防将来有人遇到此问题。

问题最初是在自定义 QPrintEngine/QPaintEngine 类的实现过程中出现的。问题中发布的代码有效--然而,当设置方向时,我忘记更新 QPrintEngine::property() 函数以返回与 PPK_PageRectPPK_PaperRect 键对应的新尺寸到景观。

请注意QPrintEngine::metric() 函数确实 似乎需要以这种方式更新(在我的项目中)。我假设这是因为metric 函数主要在使用此 QPrintEngine 实现的 QPrinter 用作绘制设备时使用,而这在我的项目中从未发生过。

无论如何,修复这个问题可以让 QImage 正确地绘制在“侧面”上。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2012-01-31
    • 2014-08-02
    • 2013-09-09
    相关资源
    最近更新 更多