如何获取直线与QPainterPath的交点

如何获取直线与QPainterPath的交点,第1张

QPainterPath提供这样一个函数来检测两个path的交集,但是这个函数无法取得一条直线段与一个封闭path的交线。因为直线段没有fill area。找了一下也没有其他函数来完成这个事情。

QPainterPath intersected ( const QPainterPath & p ) const 

于是只有自己写,我这里给出的是一个比较偷懒的算法,尽量利用qt提供的函数来做,效率很低,但是对于大多应用来说也没问题。

算法就是对线段逐点检测与contour的相交了,非常简单非常简单。

用起来速度也蛮快,对付现在这个苦逼项目完全OK~~

返回的path就是线段与任意封闭path的交线了,那么交点自然就很容易取得了。

由于QPlainTextEdit继承自QAbstractScrollArea,与普通的直接继承自QWidget的控件存在差异,QAbstractScrollArea中包含一个视窗,该视窗可以通过viewport函数来获取,刚好所有的绘制 *** 作都是在该视窗内部的,所以你应该在视窗内部进行绘制,而不是外围的widget中进行绘制(有点绕,还是看下面的代码)

假设你在头文件有如下定义:

//editorh

class Editor : public QPlainTextEdit

{

Q_OBJECT

public:

Editor(QWidget parent = 0):QPlainTextEdit(parent){}

virtual ~Editor(){}

//

protected:

void paintEvent(QPaintEvent e);

//

};

源文件内容如下

void Editor::paintEvent(QPaintEvent e)

{

//通过viewport函数获取视窗并进行绘制

//我只是简单的填充了一种颜色。

QPainter painter(viewport());

painterfillRect(rect(),Qt::cyan);

//调用QPlainTextEdit默认的绘制函数,不调用的话

//后果会很严重的。

QPlainTextEdit::paintEvent(e);

}

虽然不明白你为嘛要重载paintEvent不过我想说,如果只是为了更改背景为目的,那还是用style sheet,方便!只要不要求速度,那么就用style sheet

qt中函数paintEvent(QPaintEvent)是被系统自动调用。

paintEvent(QPaintEvent )函数是QWidget类中的虚函数,用于ui的绘制,会在多种情况下被其他函数自动调用。

1QPainter类

这个类主要提供在窗体或者其他绘图设备上进行绘图的功能,在paintEvent(QPaintEvent )中使用如下:

此类中常用的函数有:

drawXXX()函数,用于绘制图形、文字和路径等;

fillXXX()函数,用于填充,可在指定区域内进行填充;

brush()和pen()  笔刷和钢笔的相关 *** 作

2QPainterPath类

这个类为绘图提供容器,主要还是用于描述绘制路径。可以通过函数setFillRule(Qt::WindingFill);来设置填充规则,通过addRect()函数来添加绘制区域。

3QColor类

此类提供颜色支持,这里的颜色可以定义四个属性:QColor ( int r, int g, int b, int a = 255 ),即红、绿、蓝和透明度。除此之外,也可以单个设置这四个值,通过类似setAlpha()的函数即可设置,这对设计渐进效果很有帮助。

下面送上一段摘自别人项目中的代码,仅供参考学习。

12 在自定义控件的 构造函数中加入如下一段断码this-setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); //隐藏对话框标题栏QPainterPath path;QRectF rect = QRectF(0,0,100,100); //两点确定矩形范围,一般为控件大小

下面是个例子:PrivateDeclareFunctionSelectObjectLib"gdi32"(ByValhdcAsLong,ByValhObjectAsLong)AsLongPrivateDeclareFunctionGetStockObjectLib"gdi32"(ByValnIndexAsLong)AsLongPrivateDeclareFunctionGetObjectLib"gdi32"Alias"GetObjectA"(ByValhObjectAsLong,ByValnCountAsLong,lpObjectAsLOGFONT)AsLongPrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLongPrivateDeclareFunctionCreateFontIndirectLib"gdi32"Alias"CreateFontIndirectA"(lpLogFontAsLOGFONT)AsLongPrivateDeclareFunctionDrawTextLib"user32"Alias"DrawTextA"(ByValhdcAsLong,ByVallpStrAsString,ByValnCountAsLong,lpRectAsRECT,ByValwFormatAsLong)AsLongPrivateConstSYSTEM_FONT=13PrivateConstLF_FACESIZE=32PrivateTypeLOGFONTlfHeightAsLonglfWidthAsLonglfEscapementAsLonglfOrientationAsLonglfWeightAsLonglfItalicAsBytelfUnderlineAsBytelfStrikeOutAsBytelfCharSetAsBytelfOutPrecisionAsBytelfClipPrecisionAsBytelfQualityAsBytelfPitchAndFamilyAsBytelfFaceName(1ToLF_FACESIZE)AsByteEndTypePrivateTypeRECTLeftAsLongTopAsLongRightAsLongBottomAsLongEndTypePrivateSubCommand1_Click()'点击Command1运行DimofontAsLong,nfontAsLongDimlfAsLOGFONT,rAsRECTDimsAsStringofont=SelectObject(Picture1hdc,GetStockObject(SYSTEM_FONT))'获取Picture1的当前字体对象GetObjectofont,Len(lf),lf'从字体对象中获取字体信息lflfHeight=lflfHeight3'字体扩大三倍(你可以自己改其他的)nfont=CreateFontIndirect(lf)'重新建立字体对象ofont=SelectObject(Picture1hdc,nfont)'替换Picture1中的字体对象s="123你好abc"'要显示的文字rLeft=0'此四行是设置要显示文字的区域范围(即整个Picture1)rTop=0rRight=Picture1ScaleWidth\15rBottom=Picture1ScaleHeight\15DrawTextPicture1hdc,s,-1,r,0'显示文字nfont=SelectObject(Picture1hdc,ofont)'把Picture1的字体恢复为原来的DeleteObjectnfont'删除新建的字体对象EndSub

qt中函数paintEvent(QPaintEvent)是被系统自动调用。

paintEvent(QPaintEvent )函数是QWidget类中的虚函数,用于ui的绘制,会在多种情况下被其他函数自动调用。

1QPainter类

这个类主要提供在窗体或者其他绘图设备上进行绘图的功能,在paintEvent(QPaintEvent )中使用如下:

此类中常用的函数有:

drawXXX()函数,用于绘制图形、文字和路径等;

fillXXX()函数,用于填充,可在指定区域内进行填充;

brush()和pen() 笔刷和钢笔的相关 *** 作

2QPainterPath类

这个类为绘图提供容器,主要还是用于描述绘制路径。可以通过函数setFillRule(Qt::WindingFill);来设置填充规则,通过addRect()函数来添加绘制区域。

3QColor类

此类提供颜色支持,这里的颜色可以定义四个属性:QColor ( int r, int g, int b, int a = 255 ),即红、绿、蓝和透明度。除此之外,也可以单个设置这四个值,通过类似setAlpha()的函数即可设置,这对设计渐进效果很有帮助。

使用QPainterPath添加路径, 

然后用QPainter::setBrush(const QBrush & brush)设置颜色,  

QPainter::drawPath(const QPainterPath & path)绘制路径

以上就是关于如何获取直线与QPainterPath的交点全部的内容,包括:如何获取直线与QPainterPath的交点、Qt4.7 QPainter not active、qt中函数paintEvent(QPaintEvent*)是不是被系统自动调用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9325317.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存