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
#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(); }
打印预览的时候右键点击该窗口会出现下面的界面:
如果是直接打印的话,会出现下面的界面:
如果是保存窗口部件的场景到2.png,保存的图片2.png如下图所示