您的位置:首页 > 编程语言 > Qt开发

一起看代码来玩玩QT之10 Graphics

2016-02-24 15:25 357 查看
interval :间隔

render:粉刷,渲染

pro 工程中需要 + QT += widgets gui printsupport printsupport是为了打印用,

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QGraphicsScene>
#include <QGraphicsLineItem>
#include <QGraphicsPixmapItem>
#include <QGraphicsTextItem>
#include <QGraphicsPixmapItem>
#include <QGraphicsItemAnimation>
#include <QTimeLine>

#include <QPrintPreviewDialog>  // preview
#include <QPrintDialog>         // print

// display scene
#include <QGraphicsView>

#include <QTimer>
#include <QDateTime>

class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
void paintEvent(QPaintEvent *);

QGraphicsScene* _scene;  // data model
QGraphicsView* _view;   // show the data model

void resizeEvent(QResizeEvent *);
void mousePressEvent(QMouseEvent *);

QTimer* _timer;
signals:

public slots:
void slotPaintRequested(QPrinter*);
void slotTimeout();

};

#endif // MYWIDGET_H


MyWidget.cpp

#include "MyWidget.h"
#include <QApplication>
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QDebug>
#include <QPrinter>

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

_view = new QGraphicsView(this);
// _view->setViewport();
// _view->setBackgroundBrush(Qt::red);

_view->setScene(_scene = new QGraphicsScene);

_scene->addItem(lineItem = new QGraphicsLineItem(QLineF(QPointF(0, 0), QPointF(100, 100))));
_scene->addItem(textItem = new QGraphicsTextItem("Hello world"));
_scene->addItem(pixmapItem = new QGraphicsPixmapItem(QPixmap("../aaa.png")));

QTransform trans;
trans.rotate(30);
textItem->setPos(QPointF(200, 300));
textItem->setTransform(trans);
textItem->setFont(QFont("aaa", 50, 700, true));

pixmapItem->setPos(100, 100);

// Animation == cocos Action
QGraphicsItemAnimation* animation = new QGraphicsItemAnimation;
animation->setItem(pixmapItem);

QTimeLine* timeline = new QTimeLine(3000);
timeline->setLoopCount(2);

animation->setTimeLine(timeline);
animation->setTranslationAt(1, 200, 200);

//  timeline->start();

#if 0
_timer = new QTimer();
_timer->setInterval(1000);
connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
_timer->start();
#endif
QTimer::singleShot(1000, this, SLOT(slotTimeout())); //定时一次
}

void MyWidget::slotTimeout()
{
qDebug() << "Time out";
//  sender().deleteLater(); shi fang timer
}

void MyWidget::resizeEvent(QResizeEvent *)
{
// set the size of _view = MyWidget::size
_view->setGeometry(QRect(QPoint(0, 0), size()));
}

void MyWidget::paintEvent(QPaintEvent *)
{

}

/* QPixmap, QImage, QBitmap, QPicture */

void MyWidget::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::RightButton)
{
#if 0
// save the view
QPixmap pixmap(size());  //应该给一个大小,否则渲染会出问题
QPainter painter(&pixmap);
painter.fillRect(QRect(0, 0, size().width(), size().height()), Qt::white); //先画一个白底; 或者 pixmap.fill(Qt::white);

_view->render(&painter);  //渲染  view 或者  scene 都可以
pixmap.save("../bbb.png");
#endif
#if 0
// print preview
QPrintPreviewDialog dlg;
connect(&dlg, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));
dlg.exec();
#endif
QPrintDialog dlg;
connect(&dlg, SIGNAL(accepted(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));
dlg.exec();
}
}

void MyWidget::slotPaintRequested(QPrinter *printer)
{
QPainter painter(printer);
_scene->render(&painter);
painter.drawText(QPoint(100, 100), "Fuck");
}

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

MyWidget w;
w.showMaximized();
return app.exec();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: