【问题标题】:Qt: How to draw a QRect on top of a QGraphicsVideoItem?Qt:如何在 QGraphicsVideoItem 上绘制 QRect?
【发布时间】:2016-09-08 15:24:05
【问题描述】:

我有一个 QGraphicsObject 的子类。在这个类中,我使用 QMediaPlayer 和 QGraphicsVideoItem 来播放视频。我正在尝试在视频上绘图。

class MyClass : public QGraphicsObject
{
Q_OBJECT;

public slots:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

public:
    QGraphicsVideoItem *_movie_item;
    QMediaPlayer *_movie_player;
}

在paint方法中,我想在_movie_item的顶部绘制一个红色矩形。为了尝试这样做,我调用:

void MyClass::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    _movie_item->setVisible(true);
    _movie_item->play();
    painter->fillRect(startx, starty, size, size, Qt::red);
}

红色矩形被绘制在适当的位置,但它始终位于 _movie_item 下方。

有没有办法在 _movie_item 顶部绘制一个矩形而不创建另一个 QGraphicsItem,例如:

QGraphicsRectItem *_rect = new QGraphicsRectItem(_movie_item)

谢谢。

【问题讨论】:

  • Composition 是正确的做法 - 在视频项目之上放置另一个项目。
  • 感谢@ddriver 的回复。我尝试使用 QPainter 的各种合成模式,并且我可以观察到不同模式对于使用 QImage 作为其绘图设备的画家(painter->drawImage(QRectF(....), myImage))是如何工作的。但是,对于 QGraphicsVideoItem,painter 不直接用于渲染。矩形仍然总是在下面绘制。

标签: qt


【解决方案1】:

使用QGraphicsItem::ItemStacksBehindParent 标志可能会有所帮助。

From the docs:

该项目堆叠在其父项后面。默认情况下,子项是 堆叠在父项的顶部。但是设置这个标志,孩子 将堆叠在它后面。此标志对投影效果很有用 对于遵循父项几何的装饰对象 没有在它上面画画。这个标志是在 Qt 4.5 中引入的。

_movie_item->setFlag(QGraphicsItem::ItemStacksBehindParent);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多