gpt4 book ai didi

c++ - 如何在 QT 中的自定义视频小部件 t 上绘制矩形?

转载 作者:行者123 更新时间:2023-11-28 04:30:44 30 4
gpt4 key购买 nike

我想在自定义视频小部件上选择一个区域并在所选区域上绘制矩形。

到目前为止,我可以使用 QRubberband 选择一个区域,但我在释放左键单击后无法绘制矩形。

每当我单击拖动然后释放以绘制矩形时,它都会出现此错误:

QBackingStore::endPaint() called with active painter on backingstore paint device

The program has unexpectedly finished.

这是我的代码:

myvideoobject.h

#ifndef MYVIDEOOBJECT_H
#define MYVIDEOOBJECT_H

#include <QObject>
#include <QVideoWidget>
#include <QRubberBand>
#include <QPainter>
#include <QPen>
#include <QPaintEvent>
#include <QRect>
#include <QMouseEvent>
#include <QDebug>

class MyVideoObject : public QVideoWidget
{
Q_OBJECT
public:
explicit MyVideoObject(QWidget *parent = 0);

void mouseMoveEvent(QMouseEvent *ev);
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void paintEvent(QPaintEvent *ev);

private:
QRubberBand* rubberBand;
QPainter* painter;
//QRect *rectangle;

QPoint origin;
QPoint endPoint;

};

#endif // MYVIDEOOBJECT_H

myvideoobject.cpp

#include "myvideoobject.h"

MyVideoObject::MyVideoObject(QWidget* parent) :
QVideoWidget(parent)
{
rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
rubberBand->setGeometry(0,0,50,50);//ileride silebilrisin

}

void MyVideoObject::mouseMoveEvent(QMouseEvent *ev)
{
rubberBand->setGeometry(QRect(origin,ev->pos()).normalized());
}

void MyVideoObject::mousePressEvent(QMouseEvent *ev)
{
origin = ev->pos();
if(!rubberBand)
rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
rubberBand->setGeometry(QRect(origin,QSize()));
rubberBand->show();
}

void MyVideoObject::mouseReleaseEvent(QMouseEvent *ev)
{
rubberBand->hide();

endPoint = ev->pos();

painter->begin(this);
painter->drawRect(QRect(origin,endPoint));

}

void MyVideoObject::paintEvent(QPaintEvent *ev)
{
QRect rect = ev->rect();
painter = new QPainter(this);
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(Qt::black);
painter->drawText(rect,Qt::AlignCenter,"Data");
painter->drawRect(rect);

//painter->setPen(Qt::red);
}

我没有添加 mainwindow.cpp 和 mainwindow.h,因为除了使用 openfiledialog 选择视频之外没有太多代码。

最佳答案

当您创建一个指针:QPainter *painter 时,它可以指向任何内存,因为它有垃圾。所以当您执行 painter->begin(this) 时,您正在访问未初始化的内存,这就是您收到该错误的原因。另一方面,在 QWidget 中,例如 QVideoWidget 应该只在方法 paintEvent 中绘制,策略是使用保存状态的变量您想要绘制的内容,例如 QRect,然后调用更新来绘制它。

myvideoobject.h

#ifndef MYVIDEOOBJECT_H
#define MYVIDEOOBJECT_H

#include <QVideoWidget>

class QRubberBand;

class MyVideoObject : public QVideoWidget
{
public:
MyVideoObject(QWidget *parent = nullptr);
protected:
void mouseMoveEvent(QMouseEvent *ev);
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void paintEvent(QPaintEvent *ev);
private:
QRubberBand *rubberBand;
QPoint origin;
QRect rect;
};

#endif // MYVIDEOOBJECT_H

myvideoobject.cpp

#include "myvideoobject.h"

#include <QMouseEvent>
#include <QPainter>
#include <QRubberBand>

MyVideoObject::MyVideoObject(QWidget *parent):
QVideoWidget(parent),
rubberBand(nullptr){}

void MyVideoObject::mousePressEvent(QMouseEvent *ev)
{
origin = ev->pos();
if(!rubberBand)
rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
rubberBand->setGeometry(QRect(origin,QSize()));
rubberBand->show();
QVideoWidget::mousePressEvent(ev);
}

void MyVideoObject::mouseMoveEvent(QMouseEvent *ev)
{
rubberBand->setGeometry(QRect(origin,ev->pos()).normalized());
QVideoWidget::mouseMoveEvent(ev);
}

void MyVideoObject::mouseReleaseEvent(QMouseEvent *ev)
{
rect = rubberBand->geometry();
update();
QVideoWidget::mouseReleaseEvent(ev);
}

void MyVideoObject::paintEvent(QPaintEvent *ev)
{
QVideoWidget::paintEvent(ev);
QPainter painter(this);
painter.save();
painter.setBrush(Qt::red);
if(!rect.isNull())
painter.drawRect(rect);
painter.restore();
}

关于c++ - 如何在 QT 中的自定义视频小部件 t 上绘制矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53024104/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com