QT 4.7 - PaintEventを使用した動的フィードバックで2つのポイントラインを描く

StackOverflow https://stackoverflow.com//questions/11683976

質問

だから私は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);
}
.

任意の助けが高く評価されています!おかり!josh

役に立ちましたか?

解決

これがあなたが望むものであると思います。要件に従ってパラメータを変更してください。

//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を描画します。

他のヒント

ここには、ウィジェットに直接行って行をペイントする方法の例があります。

宣言:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top