Qt c ++ QPainter QVector с QPoint - PullRequest
       23

Qt c ++ QPainter QVector с QPoint

1 голос
/ 29 апреля 2020

У меня QVector<QPoint> m_vertices; в моем drawingwidget.h

class DrawingWidget: public QWidget {
    Q_OBJECT
    public:
        DrawingWidget(MainWindow *parent = 0);
        ~DrawingWidget();
        QVector<QPoint> m_vertices;

Я пытаюсь добавить / удалить вершины в моем главном окне . Мне удалось создать функцию добавления, теперь их легко удалить, но я немного запутался.

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

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

Событие MousePress. При щелчке левой кнопкой мыши я должен удалить вершину, на которую нажал

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 == DELETE_VERTEX_SELECTED) {
        if(event->button() == Qt::LeftButton) {
            m_vertices.clear();
            }
        }
    }

Как я могу это сделать?

1 Ответ

0 голосов
/ 29 апреля 2020

Этот код использует std::find_if вместе с лямбда-выражением, чтобы найти ближайшую точку. Вы, вероятно, хотите разрешить немного больше свободы, чем точный радиус круга, но это зависит от вас.

auto it = std::find_if(m_vertices.begin(), m_vertices.end(), [point = event->pos](QPoint v) {
   auto d = v - point;
   return QPoint::dotProduct(d, d) < 400; // dotProduct returns square of distance
});

if (it != m_vertices.end()) {
    m_vertices.erase(it);
}
...