一、环境介绍
QT版本: 5.12.6
操作系统: win10 64位
使用指定的图片作为QGraphicsView视图窗口的背景,并消除图元拖动时产生的残影。
思路: 派生QGraphicsScene类,重写drawBackground函数。
三、源代码
#include "my_graphicsScene.h" my_graphicsScene::my_graphicsScene(QWidget *parent): QGraphicsScene(parent) { } my_graphicsScene::~my_graphicsScene() { } void my_graphicsScene::drawBackground(QPainter *painter, const QRectF &rect) { if(views().count()==0)return; // 计算视窗的大小,消除图元拖动时出现的残影 QGraphicsView* pView=views().first(); QRect contentRect=pView->viewport()->contentsRect(); QRectF sceneRect =pView->mapToScene(contentRect).boundingRect(); //绘制指定图片作为背景 QPixmap pixmap("D:/linux-share-dir/test/www/123.jpg"); painter->drawPixmap(sceneRect,pixmap,QRect()); }
3.2 my_graphicsScene.h
#ifndef GRAPHICSSCENE_H #define GRAPHICSSCENE_H #include <QGraphicsScene> #include <QGraphicsView> #include <QPainter> #include <QPaintEvent> #include <QMouseEvent> #include <QPainterPath> #include <QPixmap> #include <QDebug> class my_graphicsScene : public QGraphicsScene { Q_OBJECT public: my_graphicsScene(QWidget *parent = nullptr); ~my_graphicsScene(); protected: void drawBackground(QPainter *painter, const QRectF &rect); }; #endif // GRAPHICSSCENE_H
3.3 widget.cpp
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); scene= new my_graphicsScene; //设置画板 ui->graphicsView->setScene(scene); //设置场景 //设置图元更新模式,当图元发生改变时,更新整个视窗 ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); //重写QGraphicsItem 可以设置文本的背景颜色 //富文本 textItem=new QGraphicsTextItem; textItem->setPlainText("QGraphicsTextItem测试."); textItem->setFont(QFont("华文琥珀",12)); textItem->setDefaultTextColor(Qt::red); //设置字体颜色 textItem->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable); scene->addItem(textItem); } /* 工程: graphicsView 日期: 2020-12-20 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 析构函数 */ Widget::~Widget() { delete ui; } /* 工程: graphicsView 日期: 2020-12-20 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 编辑状态 */ void Widget::on_pushButton_clicked() { //设置编辑状态 textItem->setTextInteractionFlags(Qt::TextEditorInteraction); } /* 工程: graphicsView 日期: 2020-12-20 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 取消编辑状态 */ void Widget::on_pushButton_2_clicked() { textItem->setTextInteractionFlags(Qt::NoTextInteraction); //取消编辑状态 //将QGraphicsTextItem上的文本实时显示在plainTextEdit上. ui->plainTextEdit->clear(); ui->plainTextEdit->insertPlainText(textItem->toPlainText()); } /* 工程: graphicsView 日期: 2020-12-20 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 选择字体 */ void Widget::on_pushButton_setfont_clicked() { bool ok; QFont font=QFontDialog::getFont(&ok, QFont("幼圆", 12),this,tr("字体选择")); if(ok) //用户点击的了确定按钮 { textItem->setFont(font); //设置当前字体 } } /* 工程: graphicsView 日期: 2020-12-20 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 选择颜色 */ void Widget::on_pushButton_setcolor_clicked() { QColor clr=QColorDialog::getColor(Qt::white,this,tr("颜色选择")); if(clr.isValid()) { textItem->setDefaultTextColor(clr); } }