前段时间写了个小程序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;
}