gpt4 book ai didi

c++ - Qt C++ QPainter QVector与QPoint

转载 作者:行者123 更新时间:2023-12-02 10:33:06 25 4
gpt4 key购买 nike

我在 drawingwidget.h 中有QVector<QPoint> m_vertices;

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

我试图在 主窗口上实现添加/删除顶点。我设法制作了add函数,现在删除它们应该很容易,但是我有点困惑。

主要思想是,我有一个弹出菜单,可以在其中选择“工具”。我可以添加顶点,删除顶点,移动顶点,添加线,删除线。这个想法是,例如,当我选择“添加顶点”时,“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();
}
}
}

我怎样才能做到这一点 ?

最佳答案

此代码将std::find_if与lambda表达式一起使用以找到最接近的点。您可能想允许比实际的圆半径更大的回旋余地,但这取决于您。

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

关于c++ - Qt C++ QPainter QVector与QPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61497452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com