gpt4 book ai didi

c++ - Qt 中的 PaintEvent 为类的每个实例绘制相同的所有小部件

转载 作者:行者123 更新时间:2023-11-28 07:42:59 25 4
gpt4 key购买 nike

<分区>

我有一个名为 MotionVectorDisplay 的类,它继承自 QWidget,我覆盖了 paintevent,我对这个类所做的是为一个大小为 16x16 的特定宏 block 绘制运动 vector ,并且在一个帧中有多个这样的宏 block ,所以我为每个宏 block 创建一个此类的新实例,传递多个参数以构建运动 vector 并将该小部件作为另一个小部件的父级以进行显示。这一切都按预期工作,但我得到这样的输出 frame

在我看来,当调用 paintevent 时,它会记住上次调用 paint 事件并保留绘制的线条并在图片中创建丑陋的困惑,应该为几个宏 block 显示几条线不是所有的人。这是代码

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类中构造宏 block ,这是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()));
}
}
}

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