QGraphicsItem 实例4 图元的旋转、缩放、切变和位移

实现图元的旋转、缩放、切变和位移

效果:

 

mainwindow.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QFrame>
#include <QGraphicsView>
#include "pixitem.h"
#include <math.h>
class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

public:
    void createControlFrame();

private:
    int angle;
    qreal scaleValue;
    qreal shearValue;
    qreal translateValue;

    QGraphicsScene *scene;
    QGraphicsView *view;
    QFrame *ctrlFrame;
    PixItem  *pixItem;

public slots:
    void slotRotate(int);
    void slotScale(int);
    void slotShear(int);
    void slotTranlate(int);

};
#endif // MAINWIDGET_H

mainwindow.cpp

#include "mainwidget.h"
#include <QSlider>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGroupBox>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle(QStringLiteral("Graphics Item Transformation"));
    angle=0;
    scaleValue=5;
    shearValue=5;
    translateValue=50;

    scene=new QGraphicsScene(this);
    scene->setSceneRect(-200,-200,400,400);

    view=new QGraphicsView(this);
    view->setScene(scene);
    view->setMinimumSize(400,400);


    QPixmap *pixmap=new QPixmap(":/new/butffly.png");
    pixItem=new PixItem(pixmap); //新建一个pixitm图元,为它传一个图片用于显示
    scene->addItem(pixItem);
    pixItem->setPos(0,0);

    ctrlFrame=new QFrame(this);
    createControlFrame();  //新建主窗体右侧的面板

    //主窗口布局
    QHBoxLayout *mainLayout=new QHBoxLayout;
    mainLayout->setMargin(10);
    mainLayout->setSpacing(20);
    mainLayout->addWidget(view);
    mainLayout->addWidget(ctrlFrame);
    this->setLayout(mainLayout); //设置布局

}

MainWidget::~MainWidget()
{
}

void MainWidget::createControlFrame()
{
    //旋转控制
    QSlider *rotateSlider=new QSlider;
    rotateSlider->setOrientation(Qt::Horizontal);
    rotateSlider->setRange(0,360);

    QHBoxLayout *rotateLayout= new QHBoxLayout;
    rotateLayout->addWidget(rotateSlider);

    QGroupBox *rotateGroup=new QGroupBox(QStringLiteral("Rotate"));
    rotateGroup->setLayout(rotateLayout);


    //缩放控制
    QSlider *scaleSlider=new QSlider;
    scaleSlider->setOrientation(Qt::Horizontal);
    scaleSlider->setRange(0,2*scaleValue);
    scaleSlider->setValue(scaleValue);

    QHBoxLayout *scaleLayout= new QHBoxLayout;
    scaleLayout->addWidget(scaleSlider);

    QGroupBox *scaleGroup=new QGroupBox(QStringLiteral("Scale"));;
    scaleGroup->setLayout(scaleLayout);


    //切变控制
    QSlider *shearSlider=new QSlider;
    shearSlider->setOrientation(Qt::Horizontal);
    shearSlider->setRange(0,2*shearValue);
    shearSlider->setValue(shearValue);

    QHBoxLayout *shearLayout= new QHBoxLayout;
    shearLayout->addWidget(shearSlider);

    QGroupBox *shearGroup=new QGroupBox(QStringLiteral("Shear"));;
    shearGroup->setLayout(shearLayout);


    //位移控制
    QSlider *translateSlider=new QSlider;
    translateSlider->setOrientation(Qt::Horizontal);
    translateSlider->setRange(0,2*translateValue); //设置Slider的范围
    translateSlider->setValue(translateValue);

    QHBoxLayout *translateLayout= new QHBoxLayout;
    translateLayout->addWidget(translateSlider);

    QGroupBox *translateGroup=new QGroupBox(QStringLiteral("Translate"));;
    translateGroup->setLayout(translateLayout);

    connect(rotateSlider,SIGNAL(valueChanged(int)),this,SLOT(slotRotate(int)));
    connect(scaleSlider,SIGNAL(valueChanged(int)),this,SLOT(slotScale(int)));
    connect(shearSlider,SIGNAL(valueChanged(int)),this,SLOT(slotShear(int)));
    connect(translateSlider,SIGNAL(valueChanged(int)),this,SLOT(slotTranlate(int)));

   //控制面板布局
    QVBoxLayout *frameLayout=new QVBoxLayout;
    frameLayout->setMargin(10);
    frameLayout->setSpacing(20);
    frameLayout->addWidget(rotateGroup);
    frameLayout->addWidget(scaleGroup);
    frameLayout->addWidget(shearGroup);
    frameLayout->addWidget(translateGroup);
    ctrlFrame->setLayout(frameLayout);

}

void MainWidget::slotRotate(int value)
{
   view->rotate(value-angle);
   angle=value;

}

void MainWidget::slotScale(int value)
{
    qreal s;
    if(value>scaleValue)
    {
        s=pow(1.1,value-scaleValue);
    }
    else
    {
        s=pow(1/1.1,scaleValue-value);
    }
    view->scale(s,s);
    scaleValue=value;
}

void MainWidget::slotShear(int value)
{
    view->shear((value-shearValue)/10.0,0);
    shearValue=value;
}

void MainWidget::slotTranlate(int value)
{
    view->translate(value-translateValue,value-translateValue);
    translateValue=value;
}

pixItem.h

#ifndef PIXITEM_H
#define PIXITEM_H
#include <QGraphicsItem>
#include <QPixmap>
#include <QPainter>
class PixItem : public QGraphicsItem
{
public:
    PixItem(QPixmap *pixmap);

    QRectF boundingRect() const ;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) ;

private:
    QPixmap pix;  //作为图元显示的图片
};

#endif // PIXITEM_H

pixItem.cpp

#include "pixitem.h"

PixItem::PixItem(QPixmap *pixmap)
{
    pix = *pixmap;
}

QRectF PixItem::boundingRect() const
{
    return QRectF(-2-pix.width()/2,-2-pix.height()/2,pix.width()+4,pix.height()+4);
}

void PixItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->drawPixmap(-pix.width()/2,-pix.height()/2,pix);

    /*inline void QPainter::drawPixmap(int x, int y, const QPixmap &pm)
    {
        drawPixmap(QPointF(x, y), pm);
    }*/
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QGraphicsItemQt中用于创建和管理2D图形元素的基类。填充图元是指在使用QGraphicsItem创建的图元中为其添加颜色、纹理或图案等装饰效果,以使其在界面中更加醒目和美观。填充图元的过程主要涉及以下几个方面: 1. 选择填充样式:首先,我们需要选择合适的填充样式。Qt提供了多种内置的填充样式,例如实心填充、线性和径向渐变、纹理填充等。我们可以通过设置QBrush对象的属性来指定填充样式,然后将其应用到图元中。 2. 创建填充对象:根据选择的填充样式,我们需要创建相应的填充对象。如果选择实心填充样式,可以直接使用QBrush的构造函数创建一个QBrush对象并指定颜色。如果选择渐变填充样式,可以使用QGradient类的子类(例如QLinearGradient和QRadialGradient)创建渐变对象,并使用addColorStop()函数指定渐变颜色和起始位置。 3. 设置填充对象:创建填充对象后,将其设置给QGraphicsItem对象的填充属性。可以使用setBrush()函数将填充对象应用到图元中,以实现填充效果。填充属性还可以通过setPen()函数来设置边框的样式。 通过上述步骤,我们可以实现使用QGraphicsItem填充图元的目标。在填充图元后,我们可以利用Qt提供的其他图形和转换功能进一步改变图元的形状、位置、旋转等属性,以实现更加丰富多样的图形展示效果。 ### 回答2: QGraphicsItemQt中用于绘制图元的基类,可以用来创建各种不同类型的图元对象。其中,填充图元是一种具有填充颜色或纹理的图元对象。 填充图元可以通过调用QPen和QBrush类的相关函数来设置填充的样式。QPen类用于设置边框的样式和颜色,而QBrush类用于设置填充的样式和颜色。 首先,我们需要创建一个QPen对象来设置填充图元的边框样式和颜色。可以通过调用QPen类的构造函数来创建一个QPen对象,并设置相应的参数,如边框样式、宽度和颜色。例如,可以使用QPen(Qt::SolidLine, 2, Qt::red)来创建一个红色宽度为2的实线边框。 然后,我们需要创建一个QBrush对象来设置填充的样式和颜色。可以通过调用QBrush类的构造函数来创建一个QBrush对象,并设置相应的参数,如填充样式和颜色。例如,可以使用QBrush(Qt::blue, Qt::SolidPattern)来创建一个蓝色的填充样式。 接下来,我们可以在派生自QGraphicsItem的自定义图元类中重写paint函数,用来绘制填充图元。在paint函数中,我们可以使用QPainter类的相关方法来设置绘制图元的属性,如边框和填充。可以通过调用QPainter类的setPen函数来设置边框属性,如QPainter::setPen(pen),然后通过调用QPainter类的setBrush函数来设置填充属性,如QPainter::setBrush(brush)。最后,我们可以使用QPainter类的drawRect或者drawEllipse等函数来绘制相应形状的填充图元。 总结起来,通过设置QPen和QBrush对象的属性,并在paint函数中使用QPainter类的相关方法,我们可以绘制具有填充颜色或纹理的图元对象。填充图元的样式和颜色可以根据具体需求进行自定义设置,以实现不同的绘制效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值