首页 > 其他分享 >QT实现绘图器

QT实现绘图器

时间:2022-12-16 14:03:33浏览次数:36  
标签:QT 实现 image ScribbleArea 绘图 void event painter size


#include <QtWidgets>
#ifndef QT_NO_PRINTER
#include <QPrinter>
#include <QPrintDialog>
#endif

#include "scribblearea.h"

ScribbleArea::ScribbleArea(QWidget *parent)
: QWidget(parent)
{
setAttribute(Qt::WA_StaticContents);
modified = false;
scribbling = false;
myPenWidth = 1;
myPenColor = Qt::blue;
}

bool ScribbleArea::openImage(const QString &fileName)

{
QImage loadedImage;
if (!loadedImage.load(fileName))
return false;

QSize newSize = loadedImage.size().expandedTo(size());
resizeImage(&loadedImage, newSize);
image = loadedImage;
modified = false;
update();
return true;
}

bool ScribbleArea::saveImage(const QString &fileName, const char *fileFormat)

{
QImage visibleImage = image;
resizeImage(&visibleImage, size());

if (visibleImage.save(fileName, fileFormat)) {
modified = false;
return true;
} else {
return false;
}
}

void ScribbleArea::setPenColor(const QColor &newColor)

{
myPenColor = newColor;
}

void ScribbleArea::setPenWidth(int newWidth)

{
myPenWidth = newWidth;
}

void ScribbleArea::clearImage()

{
image.fill(qRgb(255, 255, 255));
modified = true;
update();
}


void ScribbleArea::mousePressEvent(QMouseEvent *event)

{
if (event->button() == Qt::LeftButton) {
lastPoint = event->pos();
scribbling = true;
}
}
void ScribbleArea::mouseMoveEvent(QMouseEvent *event)
{
if ((event->buttons() & Qt::LeftButton) && scribbling)
drawLineTo(event->pos());
}

void ScribbleArea::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && scribbling) {
drawLineTo(event->pos());
scribbling = false;
}
}
void ScribbleArea::paintEvent(QPaintEvent *event)

{
QPainter painter(this);
QRect dirtyRect = event->rect();
painter.drawImage(dirtyRect, image, dirtyRect);
}

void ScribbleArea::resizeEvent(QResizeEvent *event)

{
if (width() > image.width() || height() > image.height()) {
int newWidth = qMax(width() + 128, image.width());
int newHeight = qMax(height() + 128, image.height());
resizeImage(&image, QSize(newWidth, newHeight));
update();
}
QWidget::resizeEvent(event);
}

void ScribbleArea::drawLineTo(const QPoint &endPoint)

{
QPainter painter(&image);
painter.setPen(QPen(myPenColor, myPenWidth, Qt::SolidLine, Qt::RoundCap,
Qt::RoundJoin));
painter.drawLine(lastPoint, endPoint);
modified = true;

int rad = (myPenWidth / 2) + 2;
update(QRect(lastPoint, endPoint).normalized()
.adjusted(-rad, -rad, +rad, +rad));
lastPoint = endPoint;
}

void ScribbleArea::resizeImage(QImage *image, const QSize &newSize)

{
if (image->size() == newSize)
return;

QImage newImage(newSize, QImage::Format_RGB32);
newImage.fill(qRgb(255, 255, 255));
QPainter painter(&newImage);
painter.drawImage(QPoint(0, 0), *image);
*image = newImage;
}

void ScribbleArea::print()
{
#if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG)
QPrinter printer(QPrinter::HighResolution);

QPrintDialog printDialog(&printer, this);

if (printDialog.exec() == QDialog::Accepted) {
QPainter painter(&printer);
QRect rect = painter.viewport();
QSize size = image.size();
size.scale(rect.size(), Qt::KeepAspectRatio);
painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
painter.setWindow(image.rect());
painter.drawImage(0, 0, image);
}
#endif // QT_NO_PRINTER
}

QT实现绘图器_Qt

标签:QT,实现,image,ScribbleArea,绘图,void,event,painter,size
From: https://blog.51cto.com/u_15515702/5947338

相关文章

  • 用pageOffice控件实现 office word文档 强制留痕编辑Word
    OA办公中,业务需要多人编辑word文档,需要强制留痕功能,用来查看文档编辑过程中的具体修改痕迹。怎么实现word文档的强制留痕呢?2实现方法通过pageOffice实现简单的在线打开......
  • 基于Java实现数据脱敏
    用法Jdk版本大于等于1.8maven依赖<dependency><groupId>red.zyc</groupId><artifactId>desensitization</artifactId><version>2.4.6</version></d......
  • 0基础→自动化测试框架实现:java + testng + httpclient + allure
    必备基础java基础配置文件解析(properties)fastjson的使用(处理json字符串、json数组)jsonpath的使用java操作excel(通过POIHttpClient的使用(get、post请求)TestNG用法 自动化测......
  • zookeeper单机模式实现分布式,开发部署测试模式机器有限情况
    ​​ZooKeeper的部署和测试​​一背景zookeeper是一个开源的分布式应用程序协调服务,是ApacheHadoop 的一个子项目。它是一个为分布式应用提供一致性服务的软件,提供的功能......
  • Qt之模拟键盘按下
     相关资料:https://www.ngui.cc/el/814378.html?action=onClick 一、前言最近在做QWT开发的时候碰到一个问题,QwtPlotZoomer提供的放大、缩小操作只支持鼠标事件或键盘......
  • js中map的实现
    JS中map的实现思路分析map是所有数组都可以用的方法,因此我们可以将方法挂在到Array.prototype上去之后所有的数组都可以访问到这个方法map函数,接收一个函数当作参数,并......
  • 原生JS加jQuery实现拖拽和单击上传文件
    单击实现用的是html的input标签,设置multiple='multiple'之后就可以同时选多个文件了<inputtype="file"multiple='multiple'/>拖拽实现依赖event.dataTransfer实现event.da......
  • Qt QTableView样式设置
                 QtQTableView样式设置 显示效果QSS设置 选中设置:​​QTableView::item:selected​​​​{​​​​background:rgb(0,0,100);​​......
  • 刷新页面怎么实现数字滚动?
    刷新页面,显示动态数据。......
  • 12 实现用户聚类推荐
    用户聚类结果:key-用户ID,value-聚类数字将用户聚类结果结合历史日志生成热榜记录将计算结果缓存:正排列表存用户ID和聚类数字,倒排列表存聚类数字和推荐ITEM列表在线服......