06_高级painter、保存、打印、预览

    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) { }
    
    
    
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值