转载

Qt实现自定义QGraphicsItem,实现了一个闪烁的圆,和闪烁的文字

用Qt实现了一个闪烁的圆,这个挺简单的,


下面是具体的代码:

mian.cpp:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QAction>
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMenuBar>
#include <QGraphicsEllipseItem>
#include<QMenu>
#include<QMenuBar>
#include<QTime>
#include<QTimer>
class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
     MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QAction *newitemflash;
    QAction *newtextflash;
    QMenu  *additem;
    QMenu  *addtext;
    QGraphicsScene *scene;  //定义一个场景
    QGraphicsView *view; //定义一个视图
    QTimer *timer;
    bool Flash;

public slots:
    void additemflash();
    void addtextflash();
    void newtimer();
};

#endif // MAINWINDOW_H


mainwindow.cpp:

#include "mainwindow.h"
#include "flashitem.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

   this->setFixedSize(800,800);
   newitemflash=new QAction(tr("newitemflash"),this);
   newtextflash=new QAction(tr("newtextflash"),this);

   additem=new QMenu(tr("AddItem"),this);
   addtext=new QMenu(tr("AddText"),this);
   additem->addAction(newitemflash);
   addtext->addAction(newtextflash);
   menuBar()->addMenu(additem);
   menuBar()->addMenu(addtext);

   scene=new QGraphicsScene;  //定义了一个布局
   scene->setSceneRect(-300,-300,300,300);  //定义布局的边界
   view=new QGraphicsView;    //定义了一个视图
   view->setSceneRect(-300,-300,300,300);
  
   timer=new QTimer(this); //定义一个定时器

   connect(newitemflash,SIGNAL(triggered()),this,SLOT(additemflash()));
   connect(newtextflash,SIGNAL(triggered()),this,SLOT(newtimer()));
   connect(timer,SIGNAL(timeout()),this,SLOT(addtextflash()));
   view->setScene(scene);
   view->show();

   setCentralWidget(view);  //实显示在主窗口

}


MainWindow::~MainWindow()
{

}

void MainWindow::additemflash()//定时器的开始,用button控制
{
    flashitem *item1=new flashitem;
    scene->addItem(item1);
    item1->setPos(-100,-100);
}


void MainWindow::addtextflash()
{
    QFont font("Times",20);
    QGraphicsTextItem *item = new QGraphicsTextItem("http://blog.csdn.net/zycxnanwang");
    item->setFont(font);
    item->setFlag(QGraphicsItem::ItemIsMovable); //可以移动
    QColor A;
    if(Flash==true)
    A.setBlue(200);
    else A.setGreen(200);
    item->setDefaultTextColor(A);
    scene->addItem(item);
    item->setPos(-470,50);
    Flash=!Flash;
}

void MainWindow::newtimer() //启动定时器
{

    Flash=true;
    timer->start(100);
}
flashitem.h

#ifndef FLASHITEM_H
#define FLASHITEM_H
#include<QObject>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsEllipseItem>

class flashitem:public QObject,public QGraphicsItem
{
public:
    bool flash; //这个用来标志重画函数
    flashitem();
    ~flashitem();
    QRectF boundingRect() const; //这个函数是vitual必须重新实现,否则所定义的类难以实例化


private:
     void timerEvent(QTimerEvent *); //重新实现timeEvent这个函数,定时器的作用

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);



};
#endif // FLASHITEM_H
flashitem.cpp

#include"flashitem.h"

void flashitem::timerEvent(QTimerEvent *)
{
    flash=!flash;
    this->update(); //估计重新执行paint这个函数
}



void flashitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{


    painter->setPen(Qt::blue);
    painter->setBrush(flash?(Qt::red):(Qt::green)); 
    painter->drawEllipse(-100,-100,100,100);

}

flashitem::flashitem()
{
    flash=true;
    setFlag(ItemIsMovable);  //可以移动
    startTimer(100); 
}

QRectF flashitem::boundingRect() const  //静态函数
{

    return QRectF(-400,-400,400,400);
}

flashitem::~flashitem()
{

}






正文到此结束
本文目录