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

news2025/1/14 0:41:19

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

效果:

 

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);
    }*/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部门用户权限应用设计及创建&一些实用小细节

前言 之前边做应用程序边完善数据库表&#xff0c;应用程序做出来了&#xff0c;但是数据库表也面目全非了&#xff0c;很多数据库字段都要重新设计&#xff0c;踩了个坑但是也是一种学习&#xff1a;每次代码开发也好&#xff0c;应用程序搭建也好&#xff0c;先做好数据库表…

深入探究 Java 8 新特性:Optional 类允许为空的对象类

深入探究 Java 8 新特性&#xff1a;Optional 类 概念说明 ​ 在 Java 8 中&#xff0c;引入了许多令人兴奋的新特性&#xff0c;其中之一就是 Optional 类。这个类主要用于解决空指针异常&#xff08;NullPointerException&#xff09;的问题&#xff0c;提供了一种更安全和…

kali换源之后更新

kali换源之后更新 1.更新索引 apt-get update 2.更新软件 apt-get upgrade 3.删除缓存包 apt-get clean

【网络教程】如何创建/添加钉钉机器人以及如何获取机器人的Token/Secret

文章目录 创建钉钉机器人添加钉钉机器人获取机器人的Token/Secret相关网站创建钉钉机器人 这里以PC端的操作为例,按照如下操作进行 访问 钉钉开放平台选择机器人选项卡,点击右上角的创建应用,这里会有一个弹窗,我这里选择的是继续使用旧版,如图按照要求填写相关信息创建自…

【Influxdb数据迁移,从windos移到linux】

前提——保证两边的版本不要相差太多 1、windows的导出G:\influxdb\2为暂存的目录 D:\influxdb-1.8.3_windows_amd64\influxdb-1.8.3-1>influxd backup -portable -database mydb G:\influxdb\2导出之后会有一堆文件 全部上传到/var/lib/influxdb这个目录下。这个应该是默…

vue3中使用第三方插件mitt实现任意组件通讯

vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一&#xff0c;现在我在写代码时&#xff0c;一个组件的代码超过了200行&#xff0c;基本都会拆分组件。组件拆分后&#xff0c;组件之间的通讯就很重要&#xff0c;总结了一下&#xff0c;目前有这…

阿里云席明贤:明天的视频云2.0

编者按 本文是“解构多媒体新常态”系列文章的第二篇&#xff0c;LiveVideoStack对话了阿里云视频云负责人席明贤&#xff08;花名右贤&#xff09;。面对风云变幻的内外环境&#xff0c;阿里云在视频云赛道是坚定向前的&#xff0c;在与右贤的接触中&#xff0c;他给我留下非常…

回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序…

基于医疗领域数据微调LLaMA——ChatDoctor模型

文章目录 ChatDoctor简介微调实战下载仓库并进入目录创建conda环境并配置环境&#xff08;安装相关依赖&#xff09;下载模型文件微调数据微调过程全量微调基于LoRA的微调基于微调后的模型推理 ChatDoctor简介 CHatDoctor论文&#xff1a; ChatDoctor: A Medical Chat Model F…

JavaScript:交集和差集的应用场景

在集合A和集合B中&#xff0c;属于集合A&#xff0c;同时也属于集合B的元素组成的集合&#xff0c;就是交集。 在A中所有不属于集合B元素&#xff0c;组合成集合&#xff0c;就是差集。 那么在平时的开发中&#xff0c;如何使用差集和交集来解决问题呢&#xff1f; 现在有这…

Fixed Price Incentive Fee (FPIF)

总价加激励费用 (FPIF)。这种总价合同为买方和卖方提供了一定的灵活性&#xff0c;允许一定的绩 效偏离&#xff0c;并对实现既定目标给予相关的财务奖励&#xff08;通常取决于卖方的成本、进度或技术 绩效&#xff09;。FPIF 合同中会设置价格上限&#xff0c;高于此价格上限…

剑指 Offer 61. 扑克牌中的顺子(C++实现)

剑指 Offer 61. 扑克牌中的顺子https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/ 优雅写法 bool isStraight(vector<int>& nums) {int maxVal INT_MIN, minVal INT_MAX;unordered_set<int> s;for (const int num : nums){if (num 0) // 跳过…

基于STM32+FreeRTOS的四轴机械臂

目录 项目概述&#xff1a; 一 准备阶段&#xff08;都是些废话&#xff09; 二 裸机测试功能 1.摇杆控制 接线&#xff1a; CubeMX配置&#xff1a; 代码&#xff1a; 2.蓝牙控制 接线&#xff1a; CubeMX配置 代码&#xff1a; 3.示教器控制 4.记录动作信息 5.执…

Matlab 频谱图中如何设置频率刻度

Matlab 频谱图中如何设置频率刻度&#xff08;横坐标&#xff09; 1、概述 时域信号经FFT 变换后得到了频谱&#xff0c;在作图时还必须设置正确的频率刻度&#xff0c;这样才能从图中得到正确的结果。下面来介绍如何设置正确的频率刻度。 2、案例分析 有一个余弦信号&#…

浏览器渲染原理 - 输入url 回车后发生了什么

目录 渲染时间点渲染流水线1&#xff0c;解析&#xff08;parse&#xff09;HTML1.1&#xff0c;DOM树1.2&#xff0c;CSSOM树1.3&#xff0c;解析时遇到 css 是怎么做的1.4&#xff0c;解析时遇到 js 是怎么做的 2&#xff0c;样式计算 Recalculate style3&#xff0c;布局 la…

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录 效果build.gradle&#xff08;app&#xff09;添加的依赖&#xff08;用不上的可以不加&#xff09;AndroidManifest.xml错误activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL 效果 build.gradle&#xff08;app&#xff09;添加的依赖&…

STM32 printf函数

printf函数输出流程 用户调用printf()函数到C标准库调用printf函数相关部分&#xff0c;printf函数由编译器提供的stdio.h解析。包含在usart.h文件中。fputc()最终实现输出。用户需要根据最终输出的硬件重新定义该函数&#xff0c;此过程为&#xff1a;printf重定向。 printf的…

用它来画文档插图简直太方便了

支持常用的12864接口&#xff0c;图像可保存&#xff0c;鼠标左键可delete键删除选区&#xff0c;鼠标右键抓取坐标。 支持快捷撤销操作CtrlZ、回退操作CtrlY&#xff0c;可点击此处下载软件。

Educational Codeforces Round 153 (Rated for Div. 2)ABC

Educational Codeforces Round 153 (Rated for Div. 2) 目录 A. Not a Substring题目大意思路核心代码 B. Fancy Coins题目大意思想核心代码 C. Game on Permutation题目大意思想核心代码 A. Not a Substring 题目大意 给定一个只包含“&#xff08;”和“&#xff09;”这两…

EV PV AC SPI CPI TCPI

SPI EV / PV CPI EV / ACCPI 1.25 SPI 0.8 PV 10 000 BAC 100 000EV PV * SPI 10 000 * 0.8 8000 AC EV / CPI 8000 / 1.25 6400TCPI (BAC - EV) / (BAC -AC) (100 000 - 8 000) / (100 000 - 6 400) 92 000 / 93 600 0.98290598