我有一个名为 MotionVectorDisplay 的类,它继承自 QWidget 并且我覆盖了paintevent,我对这个类所做的是为大小为 16x16 的特定宏块绘制运动矢量,并且一帧中有多个这些宏块,所以我创建了一个新的为每个宏块创建此类的实例,传入多个参数以构建运动矢量,并将该小部件作为父小部件传递给另一个小部件以进行显示。这一切都按预期工作,但我得到这样的输出
在我看来,当调用paintevent时,它会记住最后一次调用paint事件并保留绘制的线条并在图片中创建丑陋的混乱,这应该为几个宏块显示几行而不是全部他们。这是代码
mv = new MotionVectorDisplay(pics[frameCounter].motionVect,
pics[frameCounter].subMotionVector,
macBlockParent);
mv->stackUnder(cooefsLink);
QGraphicsOpacityEffect* effect =
new QGraphicsOpacityEffect(mv);
effect->setOpacity(0.9);
mv->setGraphicsEffect(effect);
if(mvToggle->checkState() == Qt::Checked)
{
mv->show();
}
else
{
mv->hide();
}
motionVectorsContain.push_back(mv);
在 MainWindow 类中构造宏块,这是 MotionVectorDisplay 类中的构造函数和 PaintEvent
MotionVectorDisplay::MotionVectorDisplay(const pair<string, string>& motionVect,
const vector<pair<string, string> >& subMotionVect,
QWidget* parent)
: QWidget(parent)
{
this->setFixedSize(16, 16);
this->setStyleSheet("background-color: transparent;");
motionVectors = &motionVect;
subMotionVectors = &subMotionVect;
}
void MotionVectorDisplay::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::black, 1.5));
for(int subMotVects = 0; subMotVects < subMotionVectors->size(); subMotVects++)
{
string x = subMotionVectors->at(subMotVects).first;
string y = subMotionVectors->at(subMotVects).second;
if(subMotVects == 0)
{
painter.drawLine(0, 0, atoi(x.c_str()), atoi(y.c_str()));
}
else if(subMotVects == 1)
{
painter.drawLine(4, 4, atoi(x.c_str()), atoi(y.c_str()));
}
else if(subMotVects == 2)
{
painter.drawLine(8, 8, atoi(x.c_str()), atoi(y.c_str()));
}
else
{
painter.drawLine(12, 12, atoi(x.c_str()), atoi(y.c_str()));
}
}
}