Qt图形视图框架(三) 自定义QGraphicsItem

来源:互联网 发布:淘宝店铺流量来源查询 编辑:程序博客网 时间:2024/05/18 19:42

自定义QGraphicsItem

目的:通过按空格或点击鼠标左键实现两张图片之间的切换
头文件:
#ifndef CHECKBOX_H#define CHECKBOX_H#include <QtWidgets>class CheckBox : public QGraphicsItem {private:    int w, h;    QPixmap a, b;    bool is_checked;public:    CheckBox(int, int, const QString &, const QString &);    QRectF boundingRect() const;    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);protected:    void mousePressEvent(QGraphicsSceneMouseEvent *);    void mouseReleaseEvent(QGraphicsSceneMouseEvent *);    void keyPressEvent(QKeyEvent *);};#endif // CHECKBOX_H

其源文件:

#include "checkbox.h"#include <QDebug>CheckBox::CheckBox(int w, int h, const QString &a, const QString &b) : w(w), h(h), a(a), b(b), is_checked(true) {}QRectF CheckBox::boundingRect() const {    return QRectF(0, 0, 50, 50);}void CheckBox::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {    Q_UNUSED(option);    Q_UNUSED(widget);    QPixmap temp;    if (is_checked) {        qDebug() << "a";        temp = a.scaled(50, 50, Qt::KeepAspectRatioByExpanding);    }    else {        qDebug() << "b";        temp = b.scaled(50, 50, Qt::KeepAspectRatioByExpanding);    }    painter->drawPixmap(0, 0, temp);}void CheckBox::mousePressEvent(QGraphicsSceneMouseEvent *event) {    if (event->button() == Qt::LeftButton) {        event->accept();    }}void CheckBox::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {    if (event->button() == Qt::LeftButton) {        qDebug() << "mouse";        event->accept();        is_checked = !is_checked;        update();    }}void CheckBox::keyPressEvent(QKeyEvent *event) {    if (event->key() == Qt::Key_Space) {        qDebug() << "key";        event->accept();        is_checked = !is_checked;        update();    }}
main:

#include <QtWidgets>#include <QApplication>#include "checkbox.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    QGraphicsScene *scene = new QGraphicsScene;    QGraphicsView *view = new QGraphicsView;    view->setScene(scene);    CheckBox cb(50, 50, ":/image/a.jpg", ":/image/timg.jpg");    cb.setFlag(QGraphicsItem::ItemIsFocusable, true);    cb.setFocus();    scene->addItem(&cb);    view->show();    return app.exec();}



原创粉丝点击