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()
{

}






实现同时带文字和图片的自定义QGraphicsItem,可以继承QGraphicsItem类,然后在自定义类中添加QPixmap和QTextItem成员变量,分别用于显示图片和文字。在paint方法中先绘制图片,再绘制文字,代码如下: ```cpp class MyGraphicsItem : public QGraphicsItem { public: MyGraphicsItem(QPixmap pixmap, QString text, QGraphicsItem* parent = nullptr) : QGraphicsItem(parent), m_pixmap(pixmap), m_text(text) { setAcceptHoverEvents(true); } QRectF boundingRect() const override { return QRectF(0, 0, m_pixmap.width(), m_pixmap.height() + m_textItem.boundingRect().height()); } void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override { painter->drawPixmap(QPointF(0, 0), m_pixmap); QFontMetrics fm(painter->font()); QRectF textRect = fm.boundingRect(m_text); qreal x = (m_pixmap.width() - textRect.width()) / 2; qreal y = m_pixmap.height() + fm.height() / 2; m_textItem.setPos(x, y); m_textItem.setPlainText(m_text); m_textItem.setDefaultTextColor(Qt::white); m_textItem.setFont(QFont("Arial", 12, QFont::Bold)); m_textItem.paint(painter, option, widget); } void mousePressEvent(QGraphicsSceneMouseEvent* event) override { setSelected(!isSelected()); QGraphicsItem::mousePressEvent(event); } QString getText() const { return m_text; } private: QPixmap m_pixmap; QString m_text; QGraphicsTextItem m_textItem; }; ``` 在这里,我重写了boundingRect方法,将其设置为图片和文字的外接矩形。在paint方法中,我先绘制了图片,然后根据文字的宽度和高度计算出文字的位置,然后绘制了文字。在mousePressEvent方法中,我设置了当图形项被点击时,选中状态切换。最后,我添加了一个getText方法,用于获取当前图形项上显示的文字。 使用这个自定义图形项的方法如下: ```cpp QGraphicsScene* scene = new QGraphicsScene; MyGraphicsItem* item1 = new MyGraphicsItem(QPixmap(":/images/image1.png"), "Item 1"); MyGraphicsItem* item2 = new MyGraphicsItem(QPixmap(":/images/image2.png"), "Item 2"); scene->addItem(item1); scene->addItem(item2); QGraphicsView* view = new QGraphicsView(scene); view->show(); ``` 这样就可以创建两个同时带文字和图片的自定义QGraphicsItem,并且可以通过点击选择切换,并且可以通过getText方法获取当前显示的文字
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值