0
我有一個名爲MotionVectorDisplay從QWidget繼承的類,我重寫paintevent,我用這個類做的是繪製運動矢量爲16×16的特定宏塊在一個幀中有多個宏塊,所以我爲每個宏塊創建了這個類的一個新實例,將多個參數傳遞給構建運動矢量,並將這個小部件的父級傳遞給另一個小部件進行顯示。這一切都如預期的那樣工作,但我得到這樣的輸出在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()));
}
}
}
的代碼位沒有工作,試圖把它在構造函數和方法的paintEvent本身尚未結果是相同。我如何重新繪製每個像素?謝謝你的幫助。 – 2013-03-18 11:10:53
我添加了一個示例 – Chris 2013-03-18 14:32:53
我發現了我的錯誤,實際上是在傳遞的信息中,但感謝您的幫助。 – 2013-03-18 18:48:10