2011-12-04 72 views
0

我对如何实现某种图形编辑器有一个小问题。 对于绘图我使用这种方法: 首先我检查是否鼠标左键单击,然后我在我的QPixmap上event-> pos()绘制一个像素,然后我调用update();重新绘制它。如果鼠标移动按下按钮(因为没有它,它将只是一些点),我还在两个点之间的QPixmap上画线。它工作得很好,但我想知道是否有更优化的方法来做到这一点。下面是一些代码(我已经跳过部分与变焦,之间的连接丢失的像素到像素等)在QPixmap上优化绘图

void Editor::paintEvent(QPaintEvent *event) 
{ 
    painter.drawPixmap(QRect(0, 0, image.width() * zoom , image.height() * zoom), 
          image); 
} 

void Editor::mousePressEvent(QMouseEvent *event) 
{ 

    if(event->button() == Qt::LeftButton) 
    { 
     setImagePixel(event->pos()); 
    } 

} 

void Editor::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(event->buttons() & Qt::LeftButton) 
    { 
     setImagePixel(event->pos(), true); 
    } 
} 

void Editor::setImagePixel(const QPoint &pos) 
{ 

    QPainter painter(&image); 
    if(image.rect().contains(i, j)) 
    { 
     painter.begin(&image); 
     painter.setPen(primaryColor); 
     painter.drawPoint(i, j); 
     painter.end(); 
    } 
} 

回答

1

是的,我会用QPainterPath及其API绘制手工制作的形状。看看它的方法:moveTo()lineTo(),它可以让你摆脱绘图逻辑(缺少像素等)。与鼠标事件相结合也很容易。

希望这会有所帮助。

+0

哇...非常感谢,真的有帮助!^_^ 我很高兴我不必重新发明车轮。祝你今天愉快。 –

+0

还有一个问题。我试图使用不同宽度的笔。但它看起来不是很好,像这样 - > http://i.imgur.com/lNdKO.png。我想这是因为我一直在绘制很多路径。我怎样才能摆脱这一点? –

+0

您是否尝试过'QPainter :: setRenderHint(QPainter :: Antialiasing,true)'?我不完全理解_I我一直在绘制大量路径_但我不确定它与渲染结果有关 – azf