我需要努力优化该代码部分一些帮助......基本上,这里的..我做这个“钢笔书法”,这通过简单地借鉴了很多相邻的倾斜线条给人的书法效果的东西...的问题是这样的:当我一个斜线的每一个平局后使用update()更新绘制区域,输出是正确的,在这个意义上,更新及时完成,因此使用钢笔一切“拉”是立即“看到”的图纸。但是,因为的很多的更新(其中100S)完成后,当在N900上运行的程序会减慢一点点...

当我尝试通过拉伸后运行更新做了一点优化的所有的倾斜线(使得所有线通过一个单一的更新而更新到绘图板()),则输出为。 ..奇怪的....就是说,画线后,立即将它们线条显得坏了(他们有空缺的补丁,其中图纸应该发生的一样)。但是,如果我触发形式窗口的重绘(比如中,通过改变形式的大小),则破碎补丁立即固定!!当我运行我的N900这个程序,它获得初始破输出,并保持这样的,因为我不知道如何在这种情况下,强制重绘......

下面是第一“优化”代码和输出(部分正确/不正确的)

void Canvas::drawLineTo(const QPoint &endPoint)
{
QPainter painter(&image);
painter.setPen(QPen(Qt::black,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
int fx=0,fy=0,k=0;
qPoints.clear();
connectingPointsCalculator2(qPoints,lastPoint.x(),lastPoint.y(),endPoint.x(),endPoint.y());
int i=0;
int x,y;
for(i=0;i<qPoints.size();i++)
{
x=qPoints.at(i).x();
y=qPoints.at(i).y();
painter.setPen(Qt::black);
painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
}
**//Updating only once after many draws:**
update (QRect(QPoint(lastPoint.x()-5,lastPoint.y()-5), QPoint(endPoint.x()+5,endPoint.y()+5)).normalized());

modified = true;
lastPoint = endPoint;
}

涂鸦在屏幕上的图像后右:

http://img823.imageshack.us/img823/8755/59943912.png

重新调整窗口的大小后,所有的断开的链接的上方固定像他们应该是..

下面是第二未优化的代码(其输出为拉伸后正确右,就像在上面的第二个画面):

void Canvas::drawLineTo(const QPoint &endPoint)
{
QPainter painter(&image);
painter.setPen(QPen(Qt::black,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
int fx=0,fy=0,k=0;
qPoints.clear();
connectingPointsCalculator2(qPoints,lastPoint.x(),lastPoint.y(),endPoint.x(),endPoint.y());
int i=0;
int x,y;
for(i=0;i<qPoints.size();i++)
{
x=qPoints.at(i).x();
y=qPoints.at(i).y();
painter.setPen(Qt::black);
painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
**//Updating repeatedly during the for loop:**
update(QRect(QPoint(x-5,y-5), QPoint(x+5,y+5)).normalized());//.adjusted(-rad,-rad,rad,rad));
}
modified = true;
int rad = (myPenWidth / 2) + 2;
lastPoint = endPoint;
}

任何人都可以看到什么问题可能是什么?

有帮助吗?

解决方案

据我所知,你应该找到x和y在for循环处理的最小值和最大值,并在update(QRect(QPoint(minX-5, minY-5), QPoint(maxX+5, maxY+5)).normalized());

使用它们

其他提示

很抱歉,如果我误解了,但你试过用“双缓冲”的做法?而不是直接在屏幕上绘制的,你“画”的点和线到内存缓冲区。在此之后,你只要缓冲区复制到屏幕上。这是更快的,并且避免了闪烁。

我不知道究竟你的问题是与虚线什么,但我可以为您提供这样的建议:保持你的笔左右。取而代之的是:

for(i=0;i<qPoints.size();i++)
{
    // ...
    painter.setPen(Qt::black);
    painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
    // ...
}

做到这一点:

QPen black_pen(Qt::black);
for(i=0;i<qPoints.size();i++)
{
    // ...
    painter.setPen(black_pen);
    painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
    // ...
}

更有甚者,如果你每次都重复调用你的drawLineTo功能使用相同的笔,存储在你的类笔,并保持它周围。在我的公司,我们发现,极大地减少绘图时间,我们可以利用它的优势。 (上一个大的图像切成两半绘制时间中的一个实例。)

另外一个说明:我不知道什么类型你画的image是的,但我猜想这是一个QImage的。当你完成绘图,如果你将反复使用未经修改的图像,你可以把它转换一次,一个QPixmap的。所述的QPixmap类被存储在被认为是准备好直接位图传输到屏幕上(但它慢了许多在许多情况下,修改正因为如此,)的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top