QPainter使用整理

Posted 浩瀚之水_csdn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

}

参考:

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

以上是关于QPainter使用整理的主要内容,如果未能解决你的问题,请参考以下文章

常用python日期日志获取内容循环的代码片段

IOS开发-OC学习-常用功能代码片段整理

QPainter使用

小程序各种功能代码片段整理---持续更新

如何使用 QPainter + QPixmap 实现鼠标绘图?

设置 QPainter 背景