Question

j'essaie donc de tracer une ligne entre deux points.Le clic gauche de la souris démarre la ligne, puis j'aimerais que la ligne soit dessinée dynamiquement lorsque la souris se déplace (presque comme un aperçu de la ligne).Cliquez à nouveau avec le bouton gauche de la souris et la ligne sera tracée de manière permanente.Je sais qu'il existe de nombreux autres articles sur QPaintEvents et j'ai combiné certaines des techniques utilisées, mais pour une raison quelconque, rien n'est dessiné sur la toile.Ci-dessous le code :

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

Toute aide est appréciée !Merci!Josh

Était-ce utile?

La solution

Je pense que c'est ce que tu veux.Modifiez les paramètres en fonction de vos besoins.

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

Ce morceau de code dessinera un 2 point line que tu veux.

Autres conseils

Voici mon exemple de comment peindre des lignes de votre manière directement sur le widget.

Déclaration:

private:
    void drawLines(QPainter *p);

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

Définition des valeurs initiales dans le constructeur:

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

Démarrage ou fin du dessin de la ligne:

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

Dessiner des lignes actuelles et sauvegardées:

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

    p->drawLines(lines);
}

Dessin:

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

    drawLines(&p);
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top