-1

だから私は2点の間に線を引こうとしています。マウスの左クリックで線が開始され、マウスの動きに合わせて線を動的に描画したいと思います (線のプレビューのように)。もう一度マウスを左クリックすると、線が永続的に描画されます。QPaintEvents については他にも多くの投稿があることを知っており、使用されているテクニックのいくつかを組み合わせましたが、何らかの理由でキャンバスに何も描画されていません。以下はコードです:

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

どんな助けでも大歓迎です!ありがとう!ジョシュ

4

2 に答える 2

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

現在の行と保存された行の描画:

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

    p->drawLines(lines);
}

描く:

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

    drawLines(&p);
}
于 2012-07-27T10:06:05.260 に答える
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します。

于 2012-07-27T10:00:35.153 に答える