• 3183阅读
  • 1回复

[提问]这个FlashItem::paint()是如何被调用的? [复制链接]

上一主题 下一主题
离线oceanwind
 

只看楼主 倒序阅读 楼主  发表于: 2016-07-24
看到书上的例子,不知道FlashItem::paint()是如何被调用的,形参中“QPainter *painter”会在重绘时自动被调用吗?代码如下(去掉了其他items只留下flashitem):

=======pro文件:============================
#-------------------------------------------------
#
# Project created by QtCreator 2013-05-30T14:48:51
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = my_GItem
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    flashitem.cpp

HEADERS  += mainwindow.h \
    flashitem.h
=======FLASHITEM_H文件============================

#ifndef FLASHITEM_H
#define FLASHITEM_H

#include <QObject>
#include <QGraphicsItem>
#include <QPainter>

class FlashItem : public QObject,public QGraphicsItem
{
    Q_OBJECT
public:
    explicit FlashItem(QObject *parent = 0);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void timerEvent(QTimerEvent *);
private:
    bool flash;
    QTimer *timer;
signals:
    
public slots:
    
};

#endif // FLASHITEM_H
=======MAINWINDOW_H文件:============================
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMenuBar>
#include <QGraphicsEllipseItem>

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void initScene();                        //初始化场景
                    //创建主窗体的菜单栏

public slots:
     void slotAddFlashItem();                       //新建一个显示窗体

private:
    QGraphicsScene *scene;


};

#endif // MAINWINDOW_H
=======FLASHITEM_CPP文件:============================
#include "flashitem.h"

FlashItem::FlashItem(QObject *parent) :
    QObject(parent)
{
    flash=true;
    setFlag(ItemIsMovable);
    startTimer(1000);
}

QRectF FlashItem::boundingRect() const
{
    qreal adjust = 2;
    return QRectF(-10-adjust,-10-adjust,43+adjust,43+adjust);
}

void FlashItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setPen(Qt::NoPen);
    painter->setBrush(Qt::darkGray);
    painter->drawEllipse(-7,-7,40,40);

    painter->setPen(QPen(Qt::black,0));
    painter->setBrush(flash?(Qt::red):(Qt::yellow));
    painter->drawEllipse(-10,-10,40,40);
}

void FlashItem::timerEvent(QTimerEvent *)
{
    flash=!flash;
    update();
}
=======main_CPP文件:============================
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}
=======mainwindow_CPP文件:============================
#include "mainwindow.h"
#include "flashitem.h"
#include <QGraphicsItemAnimation>
#include <QTimeLine>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{


    scene = new QGraphicsScene;
    scene->setSceneRect(-200,-200,400,400);

    initScene();                             //初始化场景

    QGraphicsView *view = new QGraphicsView;
    view->setScene(scene);
    view->setMinimumSize(400,400);
    view->show();

    setCentralWidget(view);
    resize(550,450);
    setWindowTitle(tr("my_GItems"));
}

MainWindow::~MainWindow()
{
    
}

void MainWindow::initScene()            //初始化场景
{
    int i;

    for(i=0;i<3;i++)
        slotAddFlashItem();

}

void MainWindow::slotAddFlashItem()      //在场景中加入一个闪烁图元
{
    FlashItem *item = new FlashItem;
    scene->addItem(item);
    item->setPos((qrand()%int(scene->sceneRect().width()))-200,(qrand()%int(scene->sceneRect().height()))-200);
}

在线kaon

只看该作者 1楼 发表于: 2016-07-25
QGraphicsView会调用的,不用管
快速回复
限100 字节
 
上一个 下一个