2013-03-17 32 views
0

我有一個名爲MotionVectorDisplay從QWidget繼承的類,我重寫paintevent,我用這個類做的是繪製運動矢量爲16×16的特定宏塊在一個幀中有多個宏塊,所以我爲每個宏塊創建了這個類的一個新實例,將多個參數傳遞給構建運動矢量,並將這個小部件的父級傳遞給另一個小部件進行顯示。這一切都如預期的那樣工作,但我得到這樣的輸出frame在Qt PaintEvent繪製所有部件相同的每個類的實例

在我看來,當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); 

這構建了宏在主窗口類,這是從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())); 
     } 
    } 
} 

回答

1

我懷疑你需要設置OpaquePaintEvent標誌上的小部件假:

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

或者(更常見的),你會重新繪製你的部件的每個像素在每個油漆事件,以便它本質上寫道OVE [R任何被畫前有,像這樣在您的油漆事件的開始:

painter.setBrush(Qt::black); // Or whatever your background color is 
painter.drawRect(rect()); 
+0

的代碼位沒有工作,試圖把它在構造函數和方法的paintEvent本身尚未結果是相同。我如何重新繪製每個像素?謝謝你的幫助。 – 2013-03-18 11:10:53

+0

我添加了一個示例 – Chris 2013-03-18 14:32:53

+0

我發現了我的錯誤,實際上是在傳遞的信息中,但感謝您的幫助。 – 2013-03-18 18:48:10

相關問題