Pergunta

então estou tentando traçar uma linha entre dois pontos.O clique esquerdo do mouse inicia a linha, então eu gostaria que a linha fosse desenhada dinamicamente conforme o mouse se move (quase como uma visualização da linha).Clique com o botão esquerdo do mouse novamente e a linha será desenhada permanentemente.Eu sei que existem muitos outros posts sobre QPaintEvents e combinei algumas das técnicas usadas, mas por algum motivo nada está sendo desenhado na tela.Abaixo está o código:

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);
}

Qualquer ajuda é apreciada!Obrigado!Josh

Foi útil?

Solução

Acho que é isso que você quer.Altere os parâmetros de acordo com suas necessidades.

//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
}

Este pedaço de código desenhará um 2 point line que você quer.

Outras dicas

Aqui está meu exemplo de como pintar linhas diretamente no widget.

Declaração:

private:
    void drawLines(QPainter *p);

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

Definindo valores iniciais no construtor:

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

Iniciando ou terminando o desenho de linha:

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();
    }
}

Desenhando linhas atuais e salvas:

void Widget::drawLines(QPainter *p)
{
    if (!startPos.isNull() && !endPos.isNull())
    {
        p->drawLine(startPos, endPos);
    }

    p->drawLines(lines);
}

Desenho:

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    QPen pen;
    pen.setColor(Qt::red);
    pen.setWidth(4);
    p.setPen(pen);

    drawLines(&p);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top