Qpainter使用详解(实时刷新)

 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();
}
 

猜你喜欢

转载自blog.csdn.net/qq_41399894/article/details/88051337