【问题标题】:Qt C++ QLine QPointQt C++ QLine QPoint
【发布时间】:2020-04-27 15:08:59
【问题描述】:

我的 drawingWidget.h

中有 QVector<QPoint> m_vertices 和 QVector<QLine>

我目前正在尝试做一个简单的绘图工具,我可以在其中添加顶点和线条。我设法在我的“MainWindow”上绘制了多个顶点,但我真的不明白,如何在创建的顶点之间实现一条线。

基本上我创建了两个点,并通过在第一个顶点上按鼠标左键和在第二个顶点上按鼠标左键...应该在它们之间创建一条线。

我该怎么做?

void DrawingWidget::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    painter.fillRect(event->rect(), Qt::blue);
    painter.setBrush(Qt::black);
    for(int i = 0; i < m_vertices.size() ; i++) {
        painter.drawEllipse(m_vertices[i], 20, 20);
    }
}
void DrawingWidget::mousePressEvent(QMouseEvent *event) {
    if(m_state == ADD_VERTEX_SELECTED) {
        if(event->button() == Qt::LeftButton) {
            //m_x = event->x();
            //m_y = event->y();
            //update();
            QPoint point = event->pos();
            m_vertices.append(point);
            update();
        }
    }
    if(m_state == ADD_LINE_SELECTED) {
        if(event->button() == Qt::LeftButton) {
            QPoint Startpoint = event->x();
            QPoint Endpoint = event->y();

        }
    }
}

【问题讨论】:

    标签: c++ qt qt5 qpainter


    【解决方案1】:

    你快到了。为此,您需要使用QPainter::drawLine 并从m_vertices 传递两个连续的鼠标QPoints。

    例如

    void DrawingWidget::paintEvent(QPaintEvent *event)
    {
      QPainter painter(this);
      painter.fillRect(event->rect(), Qt::blue);
    
      painter.setPen(QPen(Qt::black, 3)); // width of the line
    
      if(m_vertices.size() == 1) // for the first mouse click
        painter.drawEllipse(m_vertices[0], 4, 4);
    
      for(int i = 0; i < m_vertices.size()-1 ; i++)
      {
          const QPoint& point1 = m_vertices[i];
          const QPoint& point2 = m_vertices[i+1];
          // draw the mouse point
          painter.drawEllipse(point1, 4, 4);
          painter.drawEllipse(point2, 4, 4);
          // draw the line
          painter.drawLine(point1, point2);
      }
    }
    

    【讨论】:

    • 非常感谢您的回答。还有一个问题,我应该在这里写什么? if(m_state == ADD_LINE_SELECTED) { if(event->button() == Qt::LeftButton) { QPoint Startpoint = event->x(); QPoint 端点 = 事件->y(); } }
    • 我有一个弹出菜单,我可以在其中选择一个“工具”。我可以添加顶点、删除顶点、移动顶点、添加线、删除线。这个想法是,当我选择例如“添加顶点”时,“m_state”将更改为“正在添加”,所以我只能添加顶点。例如,当我选择“添加线”时,“m_state”将再次发生变化,因此我只能选择两个创建的顶点,这将在它们之间产生一条线。我希望我解释清楚:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多