• Qt学习(五)QPainter高级


     QPainter高级以及定时器

    .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
    #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";
    }
    
    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);
    
            _view->render(&painter);
            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();
    }

    总结:

    画家(painter),和纸张(窗口,QPixmap,QPrinter);画窗口只能在paintEvent中画,图像之间拷贝用render();在Qt中图像类有,QPixmap,QImage(平台独立,数据结构用位图结构),QBitmap(灰度图),QPicture(用来记录painter,保存画的轨迹),常用QPixmap(优化过的,和平台相关);QGraphics对能画的数据结构做了封装,Item,可以独立的Item进行设置,操作;

  • 相关阅读:
    C语言第三次博客作业---单层循环结构
    C语言第二次博客作业---分支结构
    C语言第一次博客作业——输入输出格式
    C语言--第0次作业
    Codeforces Round #341 Div.2 A. Wet Shark and Odd and Even
    Sources
    kuangbin_SegTree E (HDU 1698)
    (MST) HDOJ 1102 Constructing Roads
    kuangbin_SegTree B (HDU 1754)
    kuangbin_SegTree A (HDU 1166)
  • 原文地址:https://www.cnblogs.com/rainbow1122/p/8178004.html
Copyright © 2020-2023  润新知