QPainter使用整理
QPainter 基礎(chǔ)繪圖的幾種用法
方法一:無(wú)參構(gòu)造畫家時(shí),需要手動(dòng)調(diào)用begin(this)和end() 函數(shù)
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter p;
p.begin(this);
p.drawLine(…); // drawing code
p.end();
}
。。
方法二:有參構(gòu)造畫家時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用begin(this)和end() 函數(shù),可以立即直接使用畫家進(jìn)行繪圖。
這個(gè)構(gòu)造函數(shù)對(duì)于壽命較短的畫家很方便,例如在QWidget::paintEvent()中,并且只應(yīng)該使用一次
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter p(this);
}
方法三:創(chuàng)建畫布,將其作為參數(shù)構(gòu)造畫家
//使用畫家繪圖
p.drawLine(…); // drawing code
…
QPainter使用save與restore
在Qt中進(jìn)行圖像繪制,需要用到QPainter對(duì)象,這個(gè)對(duì)象可以幫助我們完成一些簡(jiǎn)單功能的繪制,比如說(shuō)繪制線條,繪制折線等簡(jiǎn)單的繪制功能。
QPainter對(duì)象,有兩個(gè)很有意思的函數(shù),這兩個(gè)函數(shù)相互之間起作用,下面,我們就來(lái)看一下這兩個(gè)函數(shù),save函數(shù)與restore函數(shù)。
painter->save();//保存當(dāng)前Painter狀態(tài)transform.translate(m_point.x(), m_point.y());//沿著x坐標(biāo)系移動(dòng)第一個(gè)變量,沿著y坐標(biāo)系移動(dòng)第二個(gè)變量transform.rotate(-m_realAngle);//繞軸逆時(shí)針旋轉(zhuǎn)變量的角度transform.translate(-m_point.x(), -m_point.y());//和上面移動(dòng)相反,返回原先的移動(dòng)painter->setTransform(transform, true);//第二個(gè)變量為true,故合并指定的變換與現(xiàn)在的變換painter->setPen(pen);//設(shè)置畫筆painter->setBrush(brush);//設(shè)置畫刷painter->drawPolygon(polygon);//將向量導(dǎo)入,繪制折線painter->restore();//恢復(fù)上面保存的狀態(tài)在這里的圖像繪制,調(diào)用了這兩個(gè)函數(shù),在一開始,調(diào)用save函數(shù),保存此時(shí)QPainter對(duì)象的狀態(tài),然后,下面開始進(jìn)行一系列圖像繪制,程序中寫下了注釋,大家可以參考,這只是程序里的一小片段。而在繪圖結(jié)束,再調(diào)用restore函數(shù),這里的作用是恢復(fù)QPainter對(duì)象的狀態(tài)為之前保存時(shí)候的狀態(tài)。
在繪制復(fù)雜圖形時(shí)候,我們常用這個(gè)功能,來(lái)保證圖形的正確繪制,不因?yàn)槎啻巫儞QQPainter屬性導(dǎo)致繪圖錯(cuò)誤,只需要調(diào)用這一組函數(shù),就能實(shí)現(xiàn)QPainter狀態(tài)的存儲(chǔ)與在此使用。
Qt的mouseMoveEvent的一些問(wèn)題:
在Qt中要捕捉鼠標(biāo)移動(dòng)事件需要重寫MouseMoveEvent,但是MouseMoveEvent為了不太耗資源在默認(rèn)狀態(tài)下是要鼠標(biāo)按下才能捕捉到。要想鼠標(biāo)不按下時(shí)的移動(dòng)也能捕捉到,需要setMouseTracking(true)。qt判定某個(gè)點(diǎn)是否在多邊形區(qū)域內(nèi)
QVector<QPointF> vpf;QPointF pfIn = QPointF(0,0);QPointF pf = QPointF(-10,-10);vpf.append(pf);pf = QPointF(10,-10);vpf.append(pf);pf = QPointF(10,10);vpf.append(pf);pf = QPointF(-10,10);vpf.append(pf);QPolygonF pol(vpf);qDebug()<<"pol:"<<pol;if(pol.contains(pfIn)){qDebug()<<"pol contains ptIn";}if(pol.containsPoint(pfIn,Qt::WindingFill)){qDebug()<<"pol containsPoint ptIn WindingFill";}QPolygon
一、描述
QPolygon繼承自是QVector 。表示多邊形的點(diǎn)集。除了QVector提供的功能外,QPolygon還提供了一些特定于點(diǎn)的功能。
二、成員函數(shù)
1、QPolygon(const QRect &rectangle, bool closed = false)
從給定的矩形構(gòu)造一個(gè)多邊形。如果closed為true,則多邊形的第五個(gè)點(diǎn)設(shè)置為rectangle.topLeft()。
2、QPolygon(const QVector &points)
可以從Qvector數(shù)據(jù)轉(zhuǎn)過(guò)來(lái)
從點(diǎn)集構(gòu)造一個(gè)多邊形。
3、QPolygon(int size)
構(gòu)造一個(gè)多邊形,含有size個(gè)空點(diǎn)(QPoint(0,0))。
4、QPolygon()
構(gòu)造一個(gè)多邊形,不含點(diǎn)。
5、QRect boundingRect()
多邊形的外接矩形。如果多邊形為空則返回QRect(0, 0, 0, 0)。
QPainter painter(this); painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));QPolygon polygon = QPolygon(); polygon << QPoint(22,33)<<QPoint(78,45)<<QPoint(111,233)<<QPoint(234,88)<<QPoint(34,89); painter.drawPolygon(polygon);painter.setPen(QPen(Qt::red, 3, Qt::DashDotLine)); painter.drawRect(polygon.boundingRect());用QPolygon可以實(shí)現(xiàn)多邊形填充。
PolygonWidget::PolygonWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PolygonWidget) {
ui->setupUi(this);
}
PolygonWidget::~PolygonWidget() {
delete ui;
}
void PolygonWidget::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);
}
參考:
總結(jié)
以上是生活随笔為你收集整理的QPainter使用整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: excel文件在u盘损坏怎么办啊 U盘中
- 下一篇: Qt绘制和保存成图片(手写签名)