0

我有一个名为 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()));
        }
    }
}
4

1 回答 1

1

我怀疑您需要将小部件上的 OpaquePaintEvent 标志设置为 false:

this->setAttribute(Qt::WA_OpaquePaintEvent, false);

或者(并且更常见),您将在每个绘制事件中重新绘制小部件的每个像素,以便它基本上覆盖之前绘制的任何内容,就像在绘制事件开始时这样:

painter.setBrush( Qt::black ); // Or whatever your background color is
painter.drawRect( rect() );
于 2013-03-18T00:28:56.637 回答