QT QGraphicsView QGraphicsScene用法

graphics view 框架结构主要包含三个类,场景类(qgraphicsscene),视图类(qgraphicsview)和图元类(qgraphicsitem)

 

 

 

 

 

#include "dialog.h"

#include <QPixmap>
#include "ui_dialog.h"
// 游戏的初始速度
static const qreal INITSPEED = 500;
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    //设置场景
    QGraphicsScene *scene = new QGraphicsScene();
    scene->setSceneRect(0,0, 750, 580);
    ui->graphicsView->setScene(scene);
    //scene->setBackgroundBrush(QPixmap(":/images/background.png"));
    topLine = scene->addLine(100,20, 400, 20);
    bottomLine = scene->addLine(100,520, 400, 520);
    leftLine = scene->addLine(100, 20, 100, 520);
    rightLine = scene->addLine(400,20,400,520);
 
 
    // 当前方块组和提示方块组
    boxGroup = new BoxGroup;
    connect(boxGroup, SIGNAL(needNewBox()), this, SLOT(clearFullRows()));
    connect(boxGroup, SIGNAL(gameFinished()), this, SLOT(gameOver()));
    scene->addItem(boxGroup);
    nextBoxGroup = new BoxGroup;
    scene->addItem(nextBoxGroup);
 
    startGame();
 
}
 
 
// 开始游戏
void Dialog::startGame()
{
    initGame();
}
 
// 初始化游戏
void Dialog::initGame()
{
    boxGroup->createBox(QPointF(300, 70));
    boxGroup->setFocus();
    boxGroup->startTimer(INITSPEED);
    gameSpeed = INITSPEED;
    nextBoxGroup->createBox(QPointF(640, 70));
}
 
// 清空满行
void Dialog::clearFullRows()
{
    // 获取比一行方格较大的矩形中包含的所有小方块
    for (int y = 429; y > 50; y -= 20) {
        QList<QGraphicsItem *> list = ui->graphicsView->scene()->items(199, y, 202, 22, Qt::ContainsItemShape, Qt::AscendingOrder);
        // 如果该行已满
        if (list.count() == 10) {
            foreach (QGraphicsItem *item, list) {
                mybox *box = (mybox*) item;
                box->deleteLater();
            }
            // 保存满行的位置
            rows << y;
        }
    }
    // 如果有满行,下移满行上面的各行再出现新的方块组
    // 如果没有满行,则直接出现新的方块组
    if(rows.count() > 0) {
        moveBox();
    } else {
        boxGroup->createBox(QPointF(300, 70), nextBoxGroup->getCurrentShape());
        // 清空并销毁提示方块组中的所有小方块
        nextBoxGroup->clearBoxGroup(true);
        nextBoxGroup->createBox(QPointF(500, 70));
    }
}
 
// 下移满行上面的所有小方块
void Dialog::moveBox()
{
    // 从位置最靠上的满行开始
    for (int i = rows.count(); i > 0;  --i) {
        int row = rows.at(i - 1);
        foreach (QGraphicsItem *item,ui->graphicsView->scene()->items(199, 49, 202, row - 47, Qt::ContainsItemShape, Qt::AscendingOrder)) {
            item->moveBy(0, 20);
        }
    }
    // 更新分数
    updateScore(rows.count());
    // 将满行列表清空为0
    rows.clear();
    // 等所有行下移以后再出现新的方块组
    boxGroup->createBox(QPointF(300, 70), nextBoxGroup->getCurrentShape());
    nextBoxGroup->clearBoxGroup(true);
    nextBoxGroup->createBox(QPointF(500, 70));
}
 
 
void Dialog::updateScore(const int fullRowNum)
{
    // 更新分数
}
 
void Dialog::gameOver()
{
    // 游戏结束
}
 
Dialog::~Dialog()
{
    delete ui;
}

                
QtQGraphicsView 中,可以通过设置 QGraphicsView::setTransformationAnchor() 和 QGraphicsView::setResizeAnchor() 等方法来控制缩放的锚点以及缩放方式。下面是一个简单的例子,用于演示如何使用 QGraphicsView 进行图像缩放: ```c++ // 创建 QGraphicsViewQGraphicsScene 对象 QGraphicsView *view = new QGraphicsView(this); QGraphicsScene *scene = new QGraphicsScene(this); view->setScene(scene); // 加载图像并添加到场景中 QPixmap pixmap("image.jpg"); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap); scene->addItem(item); // 允许视图缩放 view->setInteractive(true); view->setDragMode(QGraphicsView::ScrollHandDrag); view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); // 设置缩放锚点和缩放方式 view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); view->setResizeAnchor(QGraphicsView::AnchorUnderMouse); view->setRenderHint(QPainter::Antialiasing, false); view->setRenderHint(QPainter::SmoothPixmapTransform, false); // 设置缩放范围和步长 view->setMinimumSize(50, 50); view->setMaximumSize(2000, 2000); view->setSceneRect(0, 0, pixmap.width(), pixmap.height()); view->setAlignment(Qt::AlignCenter); // 响应鼠标滚轮事件进行缩放 view->setWheelScrollLines(1); view->setRenderHint(QPainter::SmoothPixmapTransform); connect(view, &QGraphicsView::wheelEvent, [=](QWheelEvent *event) { QPointF pos = mapToScene(event->pos()); qreal factor = qPow(qreal(2), event->delta() / 240.0); scale(factor, factor); QPointF newPos = mapToScene(event->pos()); QPointF delta = newPos - pos; translate(delta.x(), delta.y()); }); // 显示视图 view->show(); ``` 在上面的代码中,我们加载一张图片,创建一个 QGraphicsPixmapItem 对象并将其添加到 QGraphicsScene 中。然后,我们创建一个 QGraphicsView 对象,并将其设置为可交互模式,允许用户通过鼠标滚轮缩放和平移视图。接下来,我们设置缩放锚点和缩放方式,以及缩放范围和步长。最后,我们响应鼠标滚轮事件进行缩放,并显示视图。 希望这个例子对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值