【问题标题】:Pre-built shapes in QtQt 中的预构建形状
【发布时间】:2020-04-28 16:07:26
【问题描述】:

正如标题所示,我尝试使用预定义的形状,但我没有找到任何为此设计的模块或类,我认为 Qt 不提供这种可能性(我可能错了),一切都应该是通过覆盖paintEvent 函数手动完成,所以我决定创建自己的形状(一条线),问题是当我应用setRenderHint 方法时它无法正确显示:


// x1  y1  x2  y2 : are integers that change according to the geometry of the parent (QWidget)

void Line::paintEvent(QPaintEvent*)
{
   QPainter shape(this);

   shape.setRenderHint(QPainter::Antialiasing); // <== Here

   QPen pen(Qt::black);
   forme.setPen(pen);

   shape.drawLine(x1,y1,x2,y2);
}

如果我删除此功能,形状看起来很难看(在对角线),如果我保留它,绘制的线会显示渐变:

另一个问题是我每次都必须根据我的 Widget 的几何形状计算线条的定位。


所以我的问题是:是否可以创建不依赖于paintEvent 函数的形状?否则,是否有任何提供预构建形状的外部库?

【问题讨论】:

  • 使用 Qt 图形框架
  • 你使用的是什么版本的 Qt?
  • @Sergei Qt 5.14

标签: c++ qt paintevent


【解决方案1】:

您可能应该使用 QML 而不是小部件。对于您描述的问题,这似乎很自然。 QML 提供了一个组件Shape,可以轻松方便地渲染不同的形状。创建一个并添加 ShapePath 子级以呈现实际形状。

Qt 本身不提供大量的形状(仅矩形、直线和椭圆),但它确实支持SVG 的大部分子集,这意味着您可以将任何形状库构建为您的心脏内容作为 SVG 文件和加载那些。 QML 可能看起来像这样

Shape
{
    id: root

    ShapePath  {
         id: selection
         fillColor: "#EBF2F7"
         strokeWidth: 5
         strokeColor: "#0100ADEF"

         PathSvg {
             path: "L 150 50 L 100 150 z" // your path goes here 
         }     
     }
}

这是一个在 Qt 5.12 中创建的示例组件,它来自在图形编辑器中绘制并使用 Shape 组件渲染的 SVG 图形文件。它是矢量图形,在真实应用程序中完全可调整大小和完全交互(可以选择单个牙齿,禁用其中一些等)。该组件中的每个牙齿都是一个形状。

在 Qt 5.12 中,使用paintEvent() 创建自定义小部件/图形可能不是最好的选择,但如果你想坚持使用它,有一个很好的类 QSvgRenderer 可以以几乎与你过去相同的方式呈现 SVG画一条线。

【讨论】:

    【解决方案2】:

    小部件很重,将它们用于单个形状是没有用的。您想要一个可以迭代形状列表并绘制它们的小部件。存在这样的小部件:QGraphicsSceneView 显示 QGraphicsScene 中的内容。您可能希望从那里开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多