qt QPainterPath 如何判断点是否在其中(针对线)

        前段时间写了个小程序QPainterPath画线之后用鼠标点击看看是否选中,用contains(const QPointF &pt)发现不管如何点击都返回为false。原因便是貌似图形边界不包含在contains(const QPointF &pt)之中;

        解决思路:在线外一圈做一个封闭四边形,之后通过四边形判断是否点击选中。最终效果如下:

 附代码。

//==========================头文件===================
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    void paintEvent(QPaintEvent*);
    void mousePressEvent(QMouseEvent* e);
    void tranLineToPolygon(QPointF start, QPointF end);
    QPainterPath LinePath;
    QPainterPath PolygonPath;
};


//==========================源文件===================
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->setReadOnly(true);
    LinePath.moveTo(5,200);
    LinePath.lineTo(200,100);
    QPointF start(5,200);
    QPointF  end(200,100);
    tranLineToPolygon(start,end);
}

void MainWindow::tranLineToPolygon(QPointF start, QPointF end)
{
    QVector <QPointF> points;
    QPointF temp(2,2);//若想提升精度可更改此项数值
    points<<start-temp<<start+temp<<end+temp<<end-temp;
    PolygonPath.addPolygon(QPolygonF(points));
    PolygonPath.closeSubpath();
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.drawPath(LinePath);
//    painter.setPen(QColor(255,0,0)); //开启可查看可选中区域
//    painter.drawPath(PolygonPath);
}

void MainWindow::mousePressEvent(QMouseEvent *e)
{
        PolygonPath.contains(e->pos())?
                    ui->lineEdit->setText("true") :
                    ui->lineEdit->setText("false");
}


MainWindow::~MainWindow()
{
    delete ui;
}

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值