QGraphicsItem的缩放

news/2024/7/6 6:29:57

QGraphicsItem的缩放

QgarphicsItem是Qt视图体系中的项。QGraphicsItem本身是不支持鼠标拖动来缩放的,本文介绍如何通过更改鼠标事件来修改项的大小。(本文所用Qt版本为Qt4.8)

下文代码实现的功能为:按住shift,再用鼠标拖动,可以改变Box的大小。

定义类Box

class Box:public QGraphicsItem
{
    Q_DECLARE_TR_FUNCTIONS(Box)
public:
    Box();

    ...

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
};
Box::Box()
{
    setFlags(QGraphicsItem::ItemIsSelectable|
             QGraphicsItem::ItemIsMovable|
             QGraphicsItem::ItemSendsGeometryChanges|
             QGraphicsItem::ItemIsFocusable);       //接受键盘事件

    mBoundingRect = QRectF(0,0,100,100);
    mBoundingRect.translate(-mBoundingRect.center());
}

上面两段代码为Box类的定义及构造函数的实现,最重要的是三个鼠标函数的重载,及在setFlag中使Box可以接受键盘事件。

重载mousePressEvent

void Box::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->modifiers()&Qt::ShiftModifier)
    {
        resizing = true;             //resizing变量在鼠标点击时变为true                                                    //在放开时变为false
        setCursor(Qt::SizeAllCursor);//鼠标样式变为十字
    }
    else
        QGraphicsItem::mousePressEvent(event);
}

重载mouseMoveEvent

void Box::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(resizing)
    {
        QRectF rect(mBoundingRect);
        if(event->pos().x()<rect.x())
            rect.setBottomLeft(event->pos());
        else
            rect.setBottomRight(event->pos());
        mBoundingRect=rect;
        mBoundingRect.translate(-mBoundingRect.center());
        scene()->update();
    }
    else
        QGraphicsItem::mouseMoveEvent(event);
}

在这里,简单的更新Box的左下角和右上角来匹配鼠标位置。更好的做法是分别处理x和y坐标。

重载mouseReleaseEvent

void Box::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    if(resizing)
    {
        resizing = false;
        setCursor(Qt::ArrowCursor);
    }
    else
        QGraphicsItem::mouseReleaseEvent(event);
}

用户在改变大小的过程中放开鼠标,就将resizing改为true,以及将鼠标样式变回箭头。

完整的程序我已上传,请点击这里。

版本信息

1.0 20170921

知识共享许可协议
本作品采用知识共享署名-相同方式共享 3.0 未本地化版本许可协议进行许可。


http://www.niftyadmin.cn/n/3657240.html

相关文章

[概念] 权力的类型 (type of power)

PMP考试题目及“强书”中都有涉及权力(Power)和权力的类型,"强书"中区分了"职权"和"权力"&#xff0c;并给出一个表格列举了各种权力类型&#xff0c;类似下面的内容&#xff1a;* The PM must deal with upper management, subordinates, funct…

c语言运行cmd语句及pscp,plink的使用

pscp&#xff0c;plink的简单使用及c语言运行cmd语句 有时候我们会想在程序中运行cmd语句&#xff0c;我曾经就需要写一段c代码&#xff0c;调用pscp语句&#xff0c;将一段python代码上传到树莓派中&#xff0c;并用plink语句运行python代码。 我们先来看看pscp和plink语句本…

[概念] 领导风格 (leadership styles)

"强书"中列举了三种领导风格&#xff0c;下面列举了更多中类型* Autocratic leadership * Bureaucratic leadership * Charismatic leadership * Democratic leadership or Participative leadership * Laissez-faire leadership * People-oriented l…

使用python爬取小说

使用python爬虫爬取小说 喜欢看网络小说的朋友们&#xff0c;经常需要从网上下载小说。有些人不想向正版网页交钱&#xff0c;也不想注册其他网站的账号&#xff0c;那么对于某些比较冷门的小说或者是正在更新的小说来说&#xff0c;就很难下载到txt或者其他格式的小说。我就是…

我们应该如何对待开源?

前天把SSH全部看完了&#xff0c;拖了很长的时间。从2月23号开始看的SSH&#xff0c;前前后后用了两个半月。以为一个多月就能看完的。但是总是有很多事来拖慢进度。真的是应了那句话“计划赶不上变化”。 SSH是进入java方向的第二个教程了&#xff0c;从第一个的drp到现在的ss…

[概念] 激励理论 - 马斯洛需求层次理论(Maslow's hierarchy of needs)

激励理论中 马斯洛提出了一个5层的需求层次理论&#xff0c;下面的四个层次甚好理解&#xff0c;只是最高层的“Self Actualization"不太明白。有个老师在讲解习题中说”父母没有考上大学&#xff0c;于是全力培养孩子&#xff0c;孩子考了大学&#xff0c;于是乎父母实现…

协同过滤推荐算法的原理及实现

原文链接&#xff1a;http://it.sohu.com/20160323/n441708747.shtml 作者&#xff1a;蓝鲸 ------------------------------------------------------------------------------- 协同过滤推荐算法是诞生最早&#xff0c;并且较为著名的推荐算法。主要的功能是预测和推荐。…