Qt的画画,用painter画笔来做是在是太麻烦了。所以就有了本节的方法。
利用QGraphicsView窗口和QGraphicsScene这个数据结构,就可以在里面add添加想要的item;
#include "MyGraphic.h"
MyGraphic::MyGraphic( QWidget *parent):QWidget( parent ) {
QGraphicsLineItem *lineItem ;
QGraphicsTextItem *textItem ;
QGraphicsPixmapItem *pixmapItem ;
QTimeLine *timeLine ;
_view = new QGraphicsView(this) ;
_view->setScene( _scene = new QGraphicsScene ) ;
_scene->addItem( lineItem = new QGraphicsLineItem( QLine(0,0,30,50) ) ) ;
_scene->addItem( textItem = new QGraphicsTextItem("Luck dog") ) ;
_scene->addItem( pixmapItem = new QGraphicsPixmapItem(QPixmap("./1.png")) ) ;
QTransform trans ;
textItem->setTransform( trans ) ;
textItem->setPos( QPointF(200,300) ) ;
textItem->setFont( QFont("go go go...",50,700,true) ) ;
pixmapItem->setPos( 100 , 100 ) ;
/*添加动画效果*/
QGraphicsItemAnimation *animation = new QGraphicsItemAnimation ;
animation->setItem(pixmapItem) ;
timeLine = new QTimeLine(3000) ;
timeLine->setLoopCount(2) ;
animation->setTimeLine( timeLine ) ;
animation->setTranslationAt( 1 , 500 , 600 ) ;
timeLine->start() ;
#if 0
/*添加小功能:定时器*/
//这种做法是不断的定时,每到1s就执行一次;当然也可以只执行一次,在回调函数slotTimeout中摧毁这个timer
_timer = new QTimer() ;
_timer->setInterval( 1000 ) ;//定时1s
connect( _timer , SIGNAL(timeout()) , this , SLOT(slotTimeout()) ) ;
_timer->start() ;
#endif
/*方便一点的做法是:*/
QTimer::singleShot( 1000 , this , SLOT(slotTimeout ) ) ;
}
void MyGraphic::slotTimeout() {
qDebug()<<"time out";
}
void MyGraphic::resizeEvent(QResizeEvent *)
{
// set the size of _view = MyWidget::size
_view->setGeometry(QRect(QPoint(0, 0), size()));
}
void MyGraphic::mousePressEvent( QMouseEvent *ev ) {
if( ev->button()==Qt::RightButton ) {
#if 0
/* save the view */
QPixmap pixmap(this->size()) ;
QPainter painter( &pixmap ) ;
painter.fillRect( QRect(0,0,size().width(),size().height()),Qt::yellow ) ;
_view->render( &painter ) ;
// _scene->render( &painter ) ;这个函数就是将对象(view Or scene)中的内容拿到painter中,然后我们就可以从painter中拿到想要的数据了
pixmap.save( "./c.png" ) ;
#endif
#if 1
/*print preview*/
QPrintPreviewDialog dlg ;
connect( &dlg , SIGNAL(paintRequested(QPrinter*)) , this , SLOT( slotPaintRequested(QPrinter*)) ) ;
/*QPrinter printer ;
QPainter painter( &printer ) ;
_scene->render( &painter ) ;
其实这样做实现不到想要的结果。所以不推荐这种结果,还是使用信号槽的方法*/
dlg.exec() ;//dialog窗口特有的函数
#endif
#if 0
/*print the view*/
QPrintDialog dlg ;
connect( &dlg , SIGNAL(accepted(QPrinter*)) , this , SLOT(slotPaintRequested(QPrinter*)) ) ;
/*QPrinter printer ;
QPainter painter( &printer ) ;
_scene->render( &painter ) ;
其实这里也可以实现打印的,如没用信号槽,会多出现一个保存的窗口。
其实就是将画笔指向要画画的地方,这里指向了打印机。
然后这画painter是没内容的,所以需要调用render来填充画笔,
想要用那个去填充画笔(打印东西)就调用那个对象的render函数来填充painter*/
dlg.exec() ;
#endif
}
}
void MyGraphic::slotPaintRequested( QPrinter *printer ){
QPainter painter( printer ) ;
_scene->render(&painter);//这里可以测试this,_view看看效果如何
painter.drawText(QPoint(100, 100), "Fuck");
}
MyGraphic::~MyGraphic(void) { }