Qt C ++ QVector QLine QPoint Drawingtool - PullRequest
1 голос
/ 27 апреля 2020

У меня есть QVector m_vertices и QVector m_lines в моем DrawingWidget.h

Я сейчас пытаюсь сделать простой инструмент для рисования, где я могу манипулировать с вершинами и линиями. Мне удалось нарисовать несколько вершин в моем «MainWindow», теперь я пытаюсь реализовать линию между двумя вершинами

Основная идея заключается в том, что у меня есть всплывающее меню, где я могу выбрать «инструмент» , Я могу добавить вершину, удалить вершину, переместить вершину, добавить строку, удалить строку. Идея в том, что когда я выбираю, например, «Добавить вершину», то «m_state» изменится на «Добавление», поэтому я могу добавлять только вершины. Когда я выбираю «Добавить линию», например, то «m_state» снова изменится, так что я могу выбрать только две созданные вершины, что приведет к линии между ними.

enum DrawingWidgetState {
    NO_TOOL_SELECTED,
    ADD_VERTEX_SELECTED,
    MOVE_VERTEX_SELECTED,
    DELETE_VERTEX_SELECTED,
    ADD_LINE_SELECTED,
    DELETE_LINE_SELECTED
};

Здесь, в В конце концов, получается, что если я нажимаю «Добавить вершину», то, когда я помещаю вторую вершину, она автоматически помещает линию между ними

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);
    }
    for(int i = 0; i < m_vertices.size()-1 ; i++)
    {
        const QPoint& point1 = m_vertices[i];
        const QPoint& point2 = m_vertices[i+1];
        painter.drawLine(point1, point2);
    }
}
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) {
            for(int i = 0; i < m_vertices.size()-1 ; i++) {
                const auto &point1 = m_vertices[i];
                const auto &point2 = m_vertices[i+1];

            }
        }
    }
}

Может ли кто-нибудь объяснить мне, почему это происходит и что я должен сделать, чтобы улучшить мой код? Если что-то требует объяснения, я скажу.

...