QPainter类本身提供了一个事件,
voidSimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::black);
painter.setFont(QFont("Arial",30));
painter.drawText(rect(), Qt::AlignCenter, "helloQt");
}
但是这个事件是不会动态显示的,只会构造一次,所以当画动态图的时候,他明显显得较为鸡肋,所以我就选择用定时器的方法,不断的刷新显示
QPainter有许多的设置可以用来满足你的个人偏爱。
font():字体设置。
brush():画刷设置,定义颜色或者模式(pattern)来填充形状。
pen():定义颜色和点描来绘制线或者边框。
backgroundMode():来表示是否有一个background()函数。
background(): 只在backgroundMode()为Qt::OpaqueMode和 pen()是点描的时候有效。
brushOrigin():定义使用的刷子的来源,通常与widget的背景保持一致。
viewport(),window(),worldTransform()用来转换坐标变换。
hasClipping():表示painter是否绑定在某个设备上,该设备也被绑定。
layoutDirection():当绘制文本的时候定义布局方向。
worldMatrixEnable(),viewTransformEnable()描述转换坐标是否允许。
我们可以随时使用save()函数来保存QPainter的状态,并且用restore()函数来使他们回退。
int count = 0;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label_draw->installEventFilter(this);
UpdatePainterTimer = new QTimer;
UpdatePainterTimer->setInterval(2000);
connect(UpdatePainterTimer, SIGNAL(timeout()), this, SLOT(handleTimeout()));
UpdatePainterTimer->start();
}
bool MainWindow::eventFilter(QObject *obj,QEvent *event)
{
if(obj ==ui->label_draw && event->type() == QEvent::Paint)
{
drawFunction();
}
if(obj ==ui->label_draw && event->type() == QEvent::Timer)
{
handleTimeout();
}
return QWidget::eventFilter(obj, event);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::drawFunction()
{
QPainter painter(ui->label_draw);
painter.setRenderHint(QPainter::Antialiasing, true);
// 设置画笔颜色、宽度
painter.setPen(QColor(0,0,0));
// 设置画笔颜色、宽度
// painter.setPen(QPen(QColor(0, 0, 0), 2));
// 设置画刷颜色
QFont font;
font.setPointSize(15);
font.setFamily("楷体");
font.setItalic(true);
painter.setFont(font);
//点坐标
QPoint points[4] = {
QPoint(150,100),
QPoint(300,150),
QPoint(350,250),
QPoint(100,300)
};
QPainterPath path;
path.addRect(150,150,100,100);
path.moveTo(100,100);
path.cubicTo(100,100,150,100,400,400);
int startAngle = 90*16;
// 跨越度数
int spanAngle = 180*16;
switch (count) {
case 0:
ui->label->setText("1.画矩形");
painter.drawRect(QRect(0,0,100,100));
break;
case 1:
ui->label->setText("2.移动X:100px,画两倍圆");
//将(100,0)作为坐标原点
painter.translate(100,0);
//放大两倍
painter.scale(2,2);
painter.drawEllipse(QPointF(50, 50), 50, 50);
break;
case 2:
ui->label->setText("3.旋转画线");
painter.resetTransform();
painter.drawLine(200,150,400,150);
//旋转45°
painter.rotate(45);
painter.drawLine(200,150,400,150);
break;
case 3:
ui->label->setText("4.画圆角矩形");
painter.drawRoundRect(QRect(150,0,100,100));
break;
case 4:
ui->label->setText("5.画多边形");
painter.drawPolygon(points,4);
break;
case 5:
ui->label->setText("6.画多边线");
painter.drawPolyline(points,4);
break;
case 6:
ui->label->setText("7.画弧线");
painter.drawArc(QRect(150,0,100,100),startAngle,spanAngle);
break;
case 7:
ui->label->setText("8.画路径");
painter.drawPath(path);
break;
case 8:
ui->label->setText("9.画字");
painter.drawText(QRect(150,150,100,100),Qt::AlignCenter,tr("Hello Qt"));
break;
case 9:
ui->label->setText("10.画图");
painter.drawPixmap(150,50,QPixmap(":/image/1.png"));
break;
default:
break;
}
count == 9 ? count = 0:count++;
}
void MainWindow::handleTimeout()
{
ui->label_draw->update();
}