日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QPainter使用整理

發布時間:2024/9/27 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QPainter使用整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

QPainter 基礎繪圖的幾種用法

方法一:無參構造畫家時,需要手動調用begin(this)和end() 函數

void MyWidget::paintEvent(QPaintEvent *)

{
QPainter p;
p.begin(this);
p.drawLine(…); // drawing code
p.end();
}
。。

方法二:有參構造畫家時,系統會自動調用begin(this)和end() 函數,可以立即直接使用畫家進行繪圖。
這個構造函數對于壽命較短的畫家很方便,例如在QWidget::paintEvent()中,并且只應該使用一次
void MyWidget::paintEvent(QPaintEvent *)

{
QPainter p(this);

p.drawLine(...); // drawing code

}
方法三:創建畫布,將其作為參數構造畫家

QPixmap pix=QPixmap(size());//創建畫布 pix.fill(Qt::white); QPainter painter(&pix);//創建畫家.......

//使用畫家繪圖
p.drawLine(…); // drawing code

//將pixmap繪制到窗體上 painter.end(); painter.begin(this); painter.drawPixmap(0,0,pix);//將pixmap

QPainter使用save與restore

在Qt中進行圖像繪制,需要用到QPainter對象,這個對象可以幫助我們完成一些簡單功能的繪制,比如說繪制線條,繪制折線等簡單的繪制功能。

QPainter對象,有兩個很有意思的函數,這兩個函數相互之間起作用,下面,我們就來看一下這兩個函數,save函數與restore函數。

painter->save();//保存當前Painter狀態transform.translate(m_point.x(), m_point.y());//沿著x坐標系移動第一個變量,沿著y坐標系移動第二個變量transform.rotate(-m_realAngle);//繞軸逆時針旋轉變量的角度transform.translate(-m_point.x(), -m_point.y());//和上面移動相反,返回原先的移動painter->setTransform(transform, true);//第二個變量為true,故合并指定的變換與現在的變換painter->setPen(pen);//設置畫筆painter->setBrush(brush);//設置畫刷painter->drawPolygon(polygon);//將向量導入,繪制折線painter->restore();//恢復上面保存的狀態

在這里的圖像繪制,調用了這兩個函數,在一開始,調用save函數,保存此時QPainter對象的狀態,然后,下面開始進行一系列圖像繪制,程序中寫下了注釋,大家可以參考,這只是程序里的一小片段。而在繪圖結束,再調用restore函數,這里的作用是恢復QPainter對象的狀態為之前保存時候的狀態。

在繪制復雜圖形時候,我們常用這個功能,來保證圖形的正確繪制,不因為多次變換QPainter屬性導致繪圖錯誤,只需要調用這一組函數,就能實現QPainter狀態的存儲與在此使用。

Qt的mouseMoveEvent的一些問題:

在Qt中要捕捉鼠標移動事件需要重寫MouseMoveEvent,但是MouseMoveEvent為了不太耗資源在默認狀態下是要鼠標按下才能捕捉到。要想鼠標不按下時的移動也能捕捉到,需要setMouseTracking(true)。

qt判定某個點是否在多邊形區域內

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 。表示多邊形的點集。除了QVector提供的功能外,QPolygon還提供了一些特定于點的功能。

二、成員函數
1、QPolygon(const QRect &rectangle, bool closed = false)

從給定的矩形構造一個多邊形。如果closed為true,則多邊形的第五個點設置為rectangle.topLeft()。

2、QPolygon(const QVector &points)
可以從Qvector數據轉過來
從點集構造一個多邊形。

3、QPolygon(int size)

構造一個多邊形,含有size個空點(QPoint(0,0))。

4、QPolygon()

構造一個多邊形,不含點。

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可以實現多邊形填充。
PolygonWidget::PolygonWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PolygonWidget) {
ui->setupUi(this);

polygon << QPoint(20, 20); polygon << QPoint(122, 25); polygon << QPoint(130, 120); polygon << QPoint(140, 150); polygon << QPoint(20, 110); polygon << QPoint(0, 50);

}

PolygonWidget::~PolygonWidget() {
delete ui;
}

void PolygonWidget::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);

QPainter painter(this); painter.setBrush(Qt::red); painter.drawConvexPolygon(polygon);

}

參考:

  • https://www.cnblogs.com/david-china/p/14959655.html?ivk_sa=1024320u
  • https://blog.csdn.net/kenfan1647/article/details/116355996
  • 總結

    以上是生活随笔為你收集整理的QPainter使用整理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。