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