Qt获取多边形(QGraphicsPolygonItem)或Qt图形组件与直线(QLineF)的交点 - 推酷

有时需要获取直线与各种图形的交点,包括多边形和各种Qt图形框。

例如上图中,要想使连接线始终在多边形的边上,且能指向多边形中心,那么我们就要获取连线AB与多边形的交点。

1.多边形(QGraphicsPolygonItem)与直线(QLineF)的交点


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//已知点和多边形//A、B点可通过多边形的boundingRect().width()/2获取;

QPointF A;

QPointF B;

QGraphicsPolygonItem yellowItem;

 

QLineF lineAB(A,B);

//AB连线QPointF arrowPoint; //设置交点

QPolygonF yellowtPolygon = yellowItem->polygon();

QPointF p1 = yellowtPolygon.first() + yellowItem->pos();

//遍历各边连线for (int i = 1; i < yellowtPolygon.count(); ++i) { QPointF p2 = yellowtPolygon.at(i) + yellowItem->pos();

QLineF polyLine = QLineF(p1, p2);

 

//核心:判断是否相交 QLineF::IntersectType intersectType = polyLine.intersect(lineAB, &arrowPoint); if (intersectType == QLineF::BoundedIntersection) break;

p1 = p2;

}

 

//arrowPoint 即为交点

从上面代码可以看到,一个多边形和直线的交点的实现,就是遍历直线与所有边的联系,推而广之,所有Qt的图形化组件,比如QPushButton,QQGraphicsTextItem等,只要有边界的图形化组件都能获取其与直线的交点。即遍历所有边与直线的交点即可。

2.Qt图形组件与直线(QLineF)的交点


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

QPointF A;

QPointF B;

QLineF lineAB(A,B);

//AB连线

Q普通组件 m_CommentItem;

 

qreal commentWidth  = m_CommentItem->boundingRect().width();

qreal commentHeight = m_CommentItem->boundingRect().height();

 

QPointF intersectPoint;

//四个边-四条线QLineF line1(0,0,commentWidth,0

);

QLineF line2(

0,0,0

,commentHeight);

QLineF line3(commentWidth,

0

,commentWidth,commentHeight);

QLineF line4(

0

,commentHeight,commentWidth,commentHeight);

QList<QLineF> lineList;

lineList.append(line1);

lineList.append(line2);

lineList.append(line3);

lineList.append(line4);

 

//遍历四条线foreach

(QLineF oneline,lineList)

{

QLineF::IntersectType intersectType = oneline.intersect(lineAB, &intersectPoint); if (intersectType == QLineF::BoundedIntersection) break

;

}

 

//intersectPoint 即为交点

3.可参考例子:

Qt Examples and Demos -> Graphics View ->Diagram Scene

来自为知笔记(Wiz)

Qt获取多边形(QGraphicsPolygonItem)或Qt图形组件与直线(QLineF)的交点 - 推酷

时间: 2024-10-14 00:53:47

Qt获取多边形(QGraphicsPolygonItem)或Qt图形组件与直线(QLineF)的交点 - 推酷的相关文章

QT开发(七)——QT按钮组件

QT开发(七)--QT按钮组件 QT中有六种按钮组件,分别是按压按钮QPushButton.工具按钮QToolButton.单选按钮QRadioButton.多选按钮QCheckBox.命令链接按钮QCommandLinkButton.按钮盒QButtonBox. 一.QPushButton组件 1.QPushButton组件简介 QPushButton组件用于接受用户点击事件,能够显示提示字符串,是功能性组件,需要父组件作为容器,能够在父组件中进行定位,用于执行命令或触发事件. QPushBu

QT开发(六)——QT容器组件

QT开发(六)--QT容器组件 QT中有九种容器组件,分别是组合框QGroupBox.滚动区QScrollArea.工具箱QToolBox.选项卡QTabWidget.控件栈QWidgetStack.框架QFrame.组件QWidget.MDI窗口显示区QMdiArea.停靠窗口QDockWidget. 一.QGroupBox分组框 1.QGroupBox组件简介 QGroupBox为构建分组框提供了支持.分组框通常带有一个边框和一个标题栏,作为容器部件来使用,在其中可以布置各种窗口部件.分组框

QT开发(九)——QT单元组件

QT开发(九)--QT单元组件 QT有三种单元组件,分别为列表单元组件QListWidget.树形单元组件QTreeWidget.表格单元组件QTableWidget. 一.QListWidget列表单元 1.QListWidget组件简介 QListWidget列表单元组件继承自QListView,是基于单元的列表组件.QListWidget可以显示一个清单,清单中的每个项目是QListWidgetItem的一个实例,每个项目可以通过QListWidgetItem来操作.可以通过QListWi

QT开发(八)——QT单元视图组件

QT开发(八)--QT单元视图组件 QT中有四种单元视图组件,分别为列表视图QListView.树形视图QTreeView.表格视图QTableView.列视图QColumnView. 一.QListView列表视图 1.QListView组件简介 QListView列表视图,继承自QAbstractItemView.QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式. 2.QListView组件属性 QListView组件属性设置: A.n

Qt获取office文件内容

Qt获取office文件内容 需要获取word文件的文件内容.网上找了好久,大部分都是excel的.而word的很少.所以在这里记录一下,方便大家查阅和自己使用. 使用的Qt版本是5.4.2 . 下面通过代码说明: 首先在.pro文件中加入 QT       += axcontainer 需要加入以下头文件 #include <QAxWidget> #include <QAxObject> 详细代码如下 void Qt_word(QString filePath) { //指定要打

Qt获取屏幕分辨率

http://my.oschina.net/u/1255773/blog/159557 原 Qt获取屏幕分辨率 发表于1年前(2013-09-06 11:00)   阅读(546) | 评论(0) 3人收藏此文章, 我要收藏 赞0 3月21日 深圳 OSC 源创会正在报名中,送华为海思开发板 摘要 使用Qt函数获取屏幕分辨率 Qt 屏幕分辨率 目录[-] Qt获取屏幕分辨率 单个屏幕 多个屏幕 参考: Qt获取屏幕分辨率 需要使用到QDesktopWidget,相关头文件引用: #include

Qt获取组合键

CTRL+Enter发送信息的实现 在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送. 在QT4中,所有的事件都继承与QEvent这个类,以下是用QEvent来实现快捷键的功能. 首先所有QT类的基类QObject有一个成员函数installEventFilter,这个函数是用来将一个事件处理器和该QObject绑定起来,所以就有了我下面的想法. 首先在chat类定义一个eventFilter,该函数是一个虚函数,可以由子类进行更

Qt获取本机IP地址

Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHostAddress> list = QNetworkInterface::allAddresses(); foreach (QHostAddress address, list) { if (address.protocol() == QAbstractSocket::IPv4Protocol) { ipA

qt 获取系统磁盘空间大小

quint64 getDiskFreeSpace(QString driver) { LPCWSTR lpcwstrDriver=(LPCWSTR)driver.utf16(); ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes; if( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTot