for(int c = 0;c<_shape.size();++c)//控制用户当前所绘图形总数 { if(_shape.at(c) == 1)//线条 { const QVector<QPoint>& line = _lines.at(i1++);//取出一条线条 for(int j=0; j<line.size()-1; ++j)//将线条的所有线段描绘出 { p.drawLine(line.at(j), line.at(j+1)); p.end(); p.begin(this);//将当前窗体作为画布 p.drawPixmap(0,0, pix);//将pixmap画到窗体 } } else if(_shape.at(c) == 2)//矩形 { p.drawRect(_rects.at(i2++)); p.end(); p.begin(this);//将当前窗体作为画布 p.drawPixmap(0,0, pix);//将pixmap画到窗体 } else if(_shape.at(c) == 3)//椭圆 { p.drawEllipse(_ellipse.at(i3++)); p.end(); p.begin(this);//将当前窗体作为画布 p.drawPixmap(0,0, pix);//将pixmap画到窗体 } else if(_shape.at(c) == 4)//直线 { p.drawLine(_line.at(i4).topLeft(),_line.at(i4).bottomRight()); i4++; p.end(); p.begin(this);//将当前窗体作为画布 p.drawPixmap(0,0, pix);//将pixmap画到窗体 } } 那段代码如此修改会有何影响
时间: 2024-04-12 13:31:39 浏览: 79
将 `p.end()` 和 `p.begin(this)` 放在每个图形的绘制循环内,会导致每绘制一个图形后都会结束当前的绘图操作,并重新开始一个新的绘图操作。这样做可能会导致性能上的损失,并且每次绘制图形后都会重新绘制整个窗体。
另外,将 `p.drawPixmap(0, 0, pix)` 放在每个图形的绘制循环内,会导致每绘制一个图形后都会将 pixmap 绘制到窗体上,覆盖之前绘制的内容。
如果您只是想在绘制完成后将 pixmap 绘制到窗体上,可以在整个绘制过程完成后调用 `p.drawPixmap(0, 0, pix)`。这样,在所有图形都绘制完成后才会将 pixmap 绘制到窗体上。
以下是修改后的示例代码:
```cpp
for (int c = 0; c < _shape.size(); ++c) {
if (_shape.at(c) == 1) { // 线条
const QVector<QPoint>& line = _lines.at(i1++); // 取出一条线条
for (int j = 0; j < line.size() - 1; ++j) {
p.drawLine(line.at(j), line.at(j + 1));
}
} else if (_shape.at(c) == 2) { // 矩形
p.drawRect(_rects.at(i2++));
} else if (_shape.at(c) == 3) { // 椭圆
p.drawEllipse(_ellipse.at(i3++));
} else if (_shape.at(c) == 4) { // 直线
p.drawLine(_line.at(i4).topLeft(), _line.at(i4).bottomRight());
i4++;
}
}
p.drawPixmap(0, 0, pix);
```
在上述代码中,我们将 `p.end()` 和 `p.begin(this)` 移出了每个图形的绘制循环,以确保整个绘制过程只有一个结束和重新开始的操作。
我们也将 `p.drawPixmap(0, 0, pix)` 移到了循环之外,以确保在所有图形都绘制完成后才将 pixmap 绘制到窗体上。
请根据您的实际需求和代码逻辑进行适当的修改。这只是一个示例,具体的实现方式可能会因您的代码结构而有所不同。
阅读全文