Qt中创建场景并将该创景显示在窗口上面实例

QPainter 是一个画家类
画纸有好多种:窗口,打印机,QPixmap;
图像类:QPixmap, QImage, QBitmap, QPicture;
经常用的是QPixmap;性能比较高,各个系统中接口是一样的,但是图像是根据各个系统优化过的;QImage:与平台不关,都是一样的;


该实例主要的功能是:
1.创建一个场景,在该场景中添加部件,比如:图片,文本,直线等等
2.添加动画,将静态部件(如图片)变为动态部件;有一个时间线;
3.右键点击该窗口部件,将该窗口的场景保存到一个图片上面;
3.右键点击该窗口部件,将该窗口的场景输入到打印机预览;
4.右键点击该窗口部件,将该窗口的场景输入到打印机直接打印(此处是打印为pdf文件);
5.画家可以直接将文本打印;
6.简单的使用定时器;


mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QGraphicsScene>//场景
//#include <QGraphicsItem>//场景的东西
#include <QGraphicsLineItem>//线
#include <QGraphicsPixmapItem>//图像
#include <QGraphicsView>//显示场景
#include <QGraphicsPixmapItem>
#include <QGraphicsItemAnimation>//动画
#include <QTimeLine>
#include <QPrintDialog>        //打印
#include <QPrintPreviewDialog>//打印预览
#include <QTimer>//定时器
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);
    void paintEvent(QPaintEvent *);
    void resizeEvent(QResizeEvent *);
    void mousePressEvent(QMouseEvent *);

    QGraphicsScene *_scene;//场景
    QGraphicsView * _view;//显示场景

    QTimer * _timer;
signals:
    
public slots:
    void slotPaintRequested(QPrinter *);
    void slotTimeout();
};

#endif // MYWIDGET_H

mywidget.cpp

#include <QApplication>
#include "mywidget.h"
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QDebug>
#include <QPainter>
#include <QPixmap>
#include <QPrinter>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    QGraphicsLineItem * lineItem;
    QGraphicsTextItem * textItem;
    QGraphicsPixmapItem *pixmapItem;

    //QVBoxLayout *layout = new QVBoxLayout(this);
    _view = new QGraphicsView(this);
   // _view->setBackgroundBrush(Qt::red);
    //layout->addWidget(_view);
    _view->setScene(_scene = new QGraphicsScene);
    _scene->addItem(lineItem = new QGraphicsLineItem(QLineF(QPoint(0, 0), QPoint(100, 100))));
    _scene->addItem(textItem = new QGraphicsTextItem("Hello World"));
    _scene->addItem(pixmapItem = new QGraphicsPixmapItem(QPixmap("../aaa.png")));

    QTransform trans;
    trans.rotate(15);//选择15度
    textItem->setTransform(trans);//"Hello World"旋转15度
    textItem->setPos(QPointF(200, 200));
    textItem->setFont(QFont("Times", 30, 20, true));

    pixmapItem->setPos(QPointF(100, 0));
    //动画animation
    QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
    animation->setItem(pixmapItem);

    QTimeLine *timeline = new QTimeLine(3000);
    timeline->setLoopCount(3);//设置循环次数为1次
    animation->setTimeLine(timeline);//设置时间
    //animation->setRotationAt();
    animation->setTranslationAt(1, 200, 200);//会从  100, 100移动到200, 200
   // timeline->start();//动画开始
#if 0
    _timer = new QTimer();
    _timer->setInterval(3000);
    connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
    _timer->start();
#endif
    QTimer::singleShot(300, this, SLOT(slotTimeout()));
}

void MyWidget::slotTimeout()
{
    qDebug() << "timeout";
    //sender()->deleteLater();//释放掉该定时器
}

void MyWidget::paintEvent(QPaintEvent *)
{

}

void MyWidget::mousePressEvent(QMouseEvent *ev)
{
    //右键点击该窗口,保存该窗口的内容
    if(ev->button() == Qt::RightButton){

#if 0
        //保存该场景view
        QPixmap pixmap(size());
        QPainter painter(&pixmap);
        painter.fillRect(QRect(0, 0, size().width(), size().height()), Qt::white);//先将pixmap画为白色
       // _scene->render(&painter);//render,渲染,画,向pixmap中画
        _view->render(&painter);//和上面的语句效果是一样的
        pixmap.save("../bbb.png");
#endif
#if 0
        //右键打印预览该部件内容
        QPrintPreviewDialog dig;
        connect(&dig, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));
        dig.exec();
#endif

#if 1
        //真正的打印,因为没有打印机,但是它可以打印成pdf的文件;
        QPrintDialog dig;
        connect(&dig, SIGNAL(accepted(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));//
        dig.exec();

#endif
    }
}

void MyWidget::slotPaintRequested(QPrinter *printer)//QPrinter继承自QPaintDevice,是一个设备;
{
    //我们用painter向该设备中画东西;
    QPainter painter(printer);
   // this->render(&painter);//把widget中显示的东西都送到painter中,也就是送到打印机里;把窗口部件的所有内容都打印
   // _view->render(&painter);//仅仅是把当前窗口中显示内容打印下来;render函数相当于是拷贝
    _scene->render(&painter);//可以把窗口的内容打印下来
    //painter.drawText(QRectF(200, 200, 100, 100), "Hello World");//将Hello World打印
}

void MyWidget::resizeEvent(QResizeEvent *)
{
    //设置_vew的大小等于窗口的大小
    _view->setGeometry(QRect(QPoint(0, 0), size()));
}



int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    MyWidget w;
    w.setGeometry(400, 400, 600, 500);
    w.show();

    app.exec();
}

打印预览的时候右键点击该窗口会出现下面的界面:

Qt中创建场景并将该创景显示在窗口上面实例_第1张图片

如果是直接打印的话,会出现下面的界面:

Qt中创建场景并将该创景显示在窗口上面实例_第2张图片

如果是保存窗口部件的场景到2.png,保存的图片2.png如下图所示


你可能感兴趣的:(Qt中创建场景并将该创景显示在窗口上面实例)