1. Environmental introduction
QT version: 5.12.6
Operating system: win10 64 bit
2. Function introduction
Use the specified picture as the background of the QGraphicsView view window, and eliminate the afterimage produced when the primitive is dragged.
Idea: Derive the QGraphicsScene class and override the drawBackground function.
Three, source code
3.1 my_graphicsScene.cpp
#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);
}
}