
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*)是不是被系统自动调用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)