2012-07-27 3 views
-1

을 사용하여 동적 피드백이있는 2 포인트 선을 그리기 때문에 두 점 사이에 선을 그려야합니다. 마우스 왼쪽 버튼을 클릭하면 선이 시작되고 마우스를 움직이면 선이 동적으로 그려집니다 (선의 미리보기와 거의 비슷 함). 왼쪽 마우스를 다시 클릭하면 선이 영구적으로 그려집니다. QPaintEvents에 대한 다른 많은 게시물이 있으며 사용 된 기술 중 일부를 결합했지만 어떤 이유로 캔버스에 그려진 내용이 없습니다. 다음은 코드입니다.Qt 4.7 - paintEvent

void Main::mousePressEvent(QMouseEvent * event) 
{ 
    if (event->button() == Qt::LeftButton) { 
    QPointF pos = event->pos(); 
     if(mStartPoint.isNull()) { 
      if(josh.contains(pos)) 
       mStartPoint = pos; 
     } else { 
      canvas.addLine(mStartPoint.x(),mStartPoint.y(),pos.x(),pos.y()); 
      mStartPoint = QPointF(); 
     } 
    } 
} 

bool Main::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::MouseMove) 
    { 
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); 
    if (!mStartPoint.isNull()) { 
     m_targetImage = QImage(canvas.width(),canvas.height(),QImage::Format_ARGB32); 
     QPainter p; 
     p.begin(&m_targetImage); 
     p.drawLine(mStartPoint, mouseEvent->pos()); 
     p.end(); 
    } 
    statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y())); 
    } 
    return false; 
} 

void Main::paintEvent(QPaintEvent *pe) 
{ 
     QPainter painter(this); 
     QPen pen(Qt::red); 
     pen.setWidth(10); 
     painter.setPen(pen); 
     painter.drawImage(0, 0, m_targetImage); 
} 

어떤 도움을 주실 수 있나요? 감사! Josh

답변

1

나는 이것이 당신이 원하는 것이라고 생각합니다. 요구 사항에 따라 매개 변수를 변경하십시오.

//In your constructor 
m_nInitialX = 0; 
m_nInitialY = 0; 
m_nFinalX = 0; 
m_nFinalY = 0; 
m_nPTargetPixmap = 0; 
m_nPTargetPixmap = new QPixmap(400,400); 
m_nbMousePressed = false; 

void Main::mousePressEvent(QMouseEvent* event) 
{ 
     m_nbMousePressed = true; 
     m_nInitialX = event->pos().x(); 
     m_nInitialY = event->pos().y(); 
} 

void Main::mouseReleaseEvent(QMouseEvent *event) 
{ 
m_nbMousePressed = false; 
} 

void Main::paintEvent(QPaintEvent *e) 
{ 
    if(m_nbMousePressed) 
    { 
    QPainter PixmapPainter(m_nPTargetPixmap); 
    QPen pen(Qt::green); 
    PixmapPainter.setPen(pen); 
    PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY); 
    } 
    QPainter painter(this); 
    painter.drawPixmap(0, 0, *m_nPTargetPixmap); 
} 

void Main::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->type() == QEvent::MouseMove) 
    { 
    QPainter PixmapPainter(m_nPTargetPixmap); 
    QPen pen(Qt::black); 
    PixmapPainter.setPen(pen); 
    PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY); 
    update(); // update your view 
    m_nFinalX = event->pos().x(); 
    m_nFinalY = event->pos().y(); 
    } 
    update(); // update your view 
} 

이 코드 조각은 원하는 2 point line을 그립니다.

1

다음은 위젯에서 직접 선을 페인트하는 방법에 대한 예제입니다.

선언 :

private: 
    void drawLines(QPainter *p); 

    QPoint startPos; 
    QPoint endPos; 
    bool inDrawing; 
    QVector<QLine> lines; 

생성자에서 초기 값을 설정 :

Widget::Widget(QWidget *parent) 
    : QWidget(parent) 
{ 
    startPos = QPoint(); 
    endPos = QPoint(); 
    inDrawing = false; 
    setMouseTracking(true); 
} 

시작 또는 선 그리기 종료 :

: 현재와 저장 선 그리기

void Widget::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::LeftButton) 
    { 
     if (!inDrawing) 
     { 
      startPos = event->pos(); 
     } 
     else 
     { 
      endPos = event->pos(); 

      QLine line = QLine(startPos, event->pos()); 
      lines.append(line); 
     } 

     inDrawing = !inDrawing; 
    } 
} 

void Widget::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (inDrawing) 
    { 
     endPos = event->pos(); 
     update(); 
    } 
}