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
### 回答1: 对于学习 qt 知识点整理思维导图非常有帮助。首先,思维导图可以帮助我们梳理 qt 的知识结构,帮助我们建立起一个清晰的知识体系。我们可以将 qt 的主要知识点作为中心思维节点,在周围分支出各个具体的知识点,形成一个完整的思维导图。这样,我们可以清楚地看到每个知识点之间的关系和联系,更好地理解 qt 的整体架构和工作原理。 其次,思维导图可以帮助我们更好地记忆和复习 qt 的知识点。通过在思维导图中加入关键词、示意图和简单的说明,我们可以将 qt 的知识点以一种直观的方式呈现出来。这样,在复习的时候,我们可以随时查看思维导图,回忆起相关的知识点,加深记忆。同时,思维导图可以帮助我们发现知识点之间的遗漏或者薄弱之处,有助于我们有针对性地进行重点复习。 最后,思维导图还可以帮助我们提高问题解决能力。在学习 qt 的过程中,我们遇到问题时可以将问题写在思维导图中,并找到与之相关的知识点。通过思考和整理,我们可以更深入地理解问题的本质和解决方法,提高自己的问题解决能力。 综上所述,使用思维导图学习 qt 知识点非常有效。它可以帮助我们梳理知识结构、加深记忆、提高问题解决能力,是我们学习 qt 不可或缺的工具之一。 ### 回答2: Qt是一个跨平台的C++应用程序开发框架,广泛应用于图形界面应用程序的开发。学习Qt时,整理思维导图是一种很好的学习方法。 首先,在思维导图中,我会列出Qt的基本概念和核心模块,包括信号和槽机制、窗口和控件、布局管理、事件处理等。了解这些基本概念可以帮助我建立起对Qt框架的整体认识。 接下来,我会将Qt框架中常用的模块和类进行分组,如图形界面相关的模块(如QWidgets、QPainter、QPixmap等),文件操作相关的模块(如QFile、QDir等),网络通信相关的模块(如QTcpSocket、QUdpSocket等),数据库操作相关的模块(如QSqlDatabase、QSqlQuery等)等。这样做可以让我更清晰地了解Qt框架中各个部分的功能和作用。 在每个模块中,我会进一步细分各个类的功能和使用方法,并在思维导图中进行标注。比如,对于QWidgets模块,我可以列举出常用的窗口类(如QMainWindow、QDialog等)和控件类(如QPushButton、QLineEdit等),并在其旁边注明它们的作用和常用的函数。 此外,在思维导图中,我还可以加入一些示例代码和链接,以加深对Qt知识点的理解和掌握。这样一来,我在学习Qt的过程中,可以通过查阅思维导图来对各个知识点进行回顾和巩固。 总的来说,用思维导图整理Qt知识点可以使我更加系统地学习和掌握Qt框架。将各个知识点有机地结合在一起,形成一个完整的思维导图,有助于我在实际应用开发中更加灵活和高效地运用Qt技术。 ### 回答3: QT是一种跨平台应用程序开发工具,它具有丰富的库和组件,可以帮助开发者快速创建图形用户界面和实现功能丰富的应用程序。学习QT时,可以使用思维导图进行知识点整理,以帮助我们更好地理解和记忆内容。 首先,在思维导图的中心,可以写上"QT"这个关键词,作为整个思维导图的核心。然后,可以根据QT的主要功能和特点,将知识点分为以下几个方面进行整理: 1. QT基础知识:首先要了解QT的基本概念和架构,比如QT的版本、主要组件等。可以列出QT的基本特点,如跨平台性、开源性等。 2. QT的常用类和模块:在思维导图的下方,可以列出QT的常用类和模块,包括QWidget、QLayout、QLabel、QPushButton等,以及常用的模块如图形、网络、数据库等。可以进一步展开每个类和模块,记录它们的特点和示例用法。 3. QT的信号与槽机制:QT的信号与槽机制是其重要的特性之一,可以通过思维导图来详细介绍这个机制的原理和使用方法。可以展示信号和槽的连接方式、参数的传递等。 4. QT的图形用户界面设计:QT提供了丰富的图形用户界面设计工具,如Qt Designer,可以在思维导图中列出图形用户界面设计的基本步骤和注意事项,比如窗口布局、控件的选择和使用等。 5. QT的常用功能和技巧:在思维导图的边缘,可以列出一些常用的QT功能和技巧,如界面国际化、线程处理、文件操作等。可以进一步展开每个功能和技巧,记录其实现方法和使用场景。 通过思维导图的整理学习,可以清晰地掌握QT的核心知识点,有助于开发者更好地理解和运用QT进行应用程序开发。同时,思维导图也可以帮助我们进行知识的巩固和复习,提高学习效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值