Qt 拖放操作和打印操作

  • 1. 拖放操作
    • 1.1 使用拖放打开文件(拖动.txt文件)
    • 1.2 自定义拖放操作(拖动图片)
  • 2. 打印操作
  • 3. 资源下载

1. 拖放操作

  • 拖放操作分为 拖动(Drag)放下(Drop) 两种操作,当数据拖动时会被存储为 MIME(Multipurpose Internet Mail Extensions) 类型。

1.1 使用拖放打开文件(拖动.txt文件)

  • 下面完成将 .txt文件 拖如界面里的操作。
  • 头文件函数声明
    void dragEnterEvent(QDragEnterEvent *event);   //拖动进入事件void dropEvent(QDropEvent *event);             //放下事件
  • 源文件函数实现
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <QMimeData>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setAcceptDrops(true); //假如这行代码后,主窗口就可以接收放下事件了
}MainWindow::~MainWindow()
{delete ui;
}//拖动进入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{if(event->mimeData()->hasUrls())    //数据中是否包含URLevent->acceptProposedAction();  //接收elseevent->ignore();                //忽略
}//放下事件
void MainWindow::dropEvent(QDropEvent *event)
{const QMimeData * mimeData = event->mimeData(); //获取MIME数据if(mimeData->hasUrls()){QList<QUrl> urlList = mimeData->urls();QString fileName=urlList.at(0).toLocalFile();if(!fileName.isEmpty()){QFile file(fileName);   //建立QFile对象,以只读方式打开文件if(!file.open(QIODevice::ReadOnly))return;QTextStream in(&file);      //建立文本流对象ui->textEdit->setText(in.readAll());}}
}
  • 常用MIME类型数据处理函数

1.2 自定义拖放操作(拖动图片)

  • 在界面上任意拖动这张图片

  • 图片原来的位置蒙上黑色阴影效果

  • 头文件函数声明


protected:void mousePressEvent(QMouseEvent *event);       //鼠标按下事件void dragEnterEvent(QDragEnterEvent *event);    //拖动进入事件void dragMoveEvent(QDragMoveEvent *event);      //拖动事件void dropEvent(QDropEvent *event);              //放下事件
  • 编辑源文件
#include "mainwindow.h"
#include <QLabel>
#include "ui_mainwindow.h"
#include <QMouseEvent>
#include <QDrag>
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include <QDropEvent>
#include <QPainter>
#include <QMimeData>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setAcceptDrops(true);                       //设置窗口部件可以接收拖入QLabel * label = new QLabel(this);QPixmap pix("..//imagedragdrop/logo.png");label->setPixmap(pix);label->resize(pix.size());label->move(100,100);label->setAttribute(Qt::WA_DeleteOnClose);  //当窗口关闭时销毁图片
}MainWindow::~MainWindow()
{delete ui;
}//鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{//第1步:获取图片//将鼠标指针所在位置的部件强制转换为Label类型QLabel * child = static_cast<QLabel *>(childAt(event->pos()));if(!child->inherits("QLabel"))return;QPixmap pixmap = *child->pixmap();//第2步:自定义MIME类型QByteArray itemData;QDataStream dataStream(&itemData,QIODevice::WriteOnly);//将图片信息,位置信息输入到自己数组中dataStream<<pixmap<<QPoint(event->pos()-child->pos());//第3步:将数据放入QMimeData中QMimeData *mimeData = new QMimeData;//将字节数组放入QMimeData中,这里的MIME类型是我们自己定义的mimeData->setData("myimage/png",itemData);//第4步:将QMimeData数据放入QDrag中QDrag *drag = new QDrag(this);      //创建QDrag用来移动数据drag->setMimeData(mimeData);drag->setPixmap(pixmap);            //在移动过程中显示图片,若不设置则默认显示一个小矩形drag->setHotSpot(event->pos()-child->pos());    //拖动时鼠标指针的位置不变//第5步:给原图添加阴影QPixmap tempPixmap = pixmap;QPainter painter;painter.begin(&tempPixmap);//在图片的外接矩形中添加一层透明的淡黑色形成阴影效果painter.fillRect(pixmap.rect(),QColor(127,127,127,127));painter.end();child->setPixmap(tempPixmap);       //在移动图片过程中,让原图片有一层黑色阴影//第6步:执行拖放操作if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction){child->close();             //如果是移动操作,那么拖放完成后关闭原标签}else{child->show();              //如果是复制操作,那么拖放完成后显示标签child->setPixmap(pixmap);   //显示原图片,不再使用阴影}}//拖入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{if(event->mimeData()->hasFormat("myimage/png")){event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}
}//拖动事件
void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{if(event->mimeData()->hasFormat("myimage/png")){event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}
}//放下事件
void MainWindow::dropEvent(QDropEvent *event)
{if(event->mimeData()->hasFormat("myimage/png")){QByteArray itemData = event->mimeData()->data("myimage/png");QDataStream dataStream(&itemData,QIODevice::ReadOnly);QPixmap pixmap;QPoint offset;dataStream>>pixmap>>offset;QLabel * newLabel = new QLabel(this);newLabel->setPixmap(pixmap);newLabel->resize(pixmap.size());newLabel->move(event->pos()-offset);newLabel->show();newLabel->setAttribute(Qt::WA_DeleteOnClose);  //当窗口关闭时销毁图片event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}
}

2. 打印操作

  • Qt Print Support模块提供了对打印的支持。
  • 只需要使用一个QPrinter 类 和 一个 QPrintDialog 类 就可以完成文档的打印操作。

  • myprint.pro文件
QT += printsupport
  • 头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
class QPrinter;namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;private slots:void doPrint();void doPrintPreview();void printPreview(QPrinter *printer);void createPdf();};#endif // MAINWINDOW_H
  • 源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPrinter>
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#include <QFileDialog>
#include <QFileInfo>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QAction *action_print = new QAction(tr("打印"),this);QAction *action_printPreview = new QAction(tr("打印预览"),this);QAction *action_pdf = new QAction(tr("生成pdf"),this);connect(action_print,SIGNAL(triggered()),this,SLOT(doPrint()));connect(action_printPreview,SIGNAL(triggered()),this,SLOT(doPrintPreview()));connect(action_pdf,SIGNAL(triggered()),this,SLOT(createPdf()));ui->mainToolBar->addAction(action_print);ui->mainToolBar->addAction(action_printPreview);ui->mainToolBar->addAction(action_pdf);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::doPrint()                    // 打印
{QPrinter printer;                         // 创建打印机对象QPrintDialog dlg(&printer, this);         // 创建打印对话框// 如果编辑器中有选中区域,则打印选中区域if (ui->textEdit->textCursor().hasSelection())dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);if (dlg.exec() == QDialog::Accepted) {    // 如果在对话框中按下了打印按钮ui->textEdit->print(&printer);        // 则执行打印操作}
}void MainWindow::doPrintPreview()                    // 打印预览
{QPrinter printer;QPrintPreviewDialog preview(&printer, this);     // 创建打印预览对话框// 当要生成预览页面时,发射paintRequested()信号connect(&preview, &QPrintPreviewDialog::paintRequested,this, &MainWindow::printPreview);preview.exec();
}void MainWindow::printPreview(QPrinter *printer)
{ui->textEdit->print(printer);
}void MainWindow::createPdf()                // 生成PDF文件
{QString fileName = QFileDialog::getSaveFileName(this, tr("导出PDF文件"),QString(), "*.pdf");if (!fileName.isEmpty()) {if (QFileInfo(fileName).suffix().isEmpty())fileName.append(".pdf");        // 如果文件后缀为空,则默认使用.pdfQPrinter printer;printer.setOutputFormat(QPrinter::PdfFormat);    // 指定输出格式为pdfprinter.setOutputFileName(fileName);ui->textEdit->print(&printer);}
}

3. 资源下载

https://download.csdn.net/download/weixin_38566632/85115518

Qt拖放操作和打印操作相关推荐

  1. SAP打印机原理、打印配置及打印操作

    一.SAP打印原理  SAP的打印过程分两个步骤: 创建假脱机请求 创建输出请求 在点击打印按钮后,系统会提示创建假脱机请求后,你可以选择直接生成输出请求,或者手动生成输出请求,产生输出请求后,系统会 ...

  2. 【Qt】DOM创建和操作XML文档

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 创建XML文档 04. 读取XML文档 05. 增加XML节点 06. 查找.删除.更新XML文档 07. 附录 01. ...

  3. Qt中与文件目录相关操作

    一.与文件目录操作有关操作. Qt中与文件目录相关的操作在QDir中,需加入#include <QDir>语句. QDir::drives()是列出电脑根目录下的所有目录,返回的是QFil ...

  4. Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties...

    你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新 ...

  5. Qt对word文档操作总结

    Qt对word文档操作总结 近期在使用Qt对word进行读写操作时候遇到很多问题,对于Qt内部没有很好的库函数可以使用.office官网上的文档只有VBA的示例,没有Qt的语法例子.在这里作者介绍了一 ...

  6. python怎么操作打印机打印文字

    python怎么操作打印机打印文字 import tempfile import win32api import win32printfilename = tempfile.mktemp (" ...

  7. c226打印机驱动安装_打印机驱动怎么安装?国产操作系统安装打印驱动方法图文步骤详解...

    接下来为大家分享的是关于国产操作系统安装打印驱动的操作方法. 机型:VA机器除外 操作步骤: 步骤1:驱动压缩包解压并提取 步骤2:添加打印驱动 (1)打开打印机设置 (开始-控制面板-打印机) (2 ...

  8. linux禁用打印切换服务命令行,linux下启用或禁用打印机的打印操作

    启用或禁用打印机的打印操作 1.enable 和 disable 命令 enable 和 disable 命令控制打印机打印还是停止打印打印队列中的请求.当您禁用打印机时,打印机将停止打印队列中的请求 ...

  9. Qt 文件和文件夹操作

    Qt 文件和文件夹操作 复制文件 设置文件的访问权限 删除文件 删除单个文件 批量删除文件 示例 获取文件信息 批量修改文件名 写文本文件 读文本文件 压缩和解压缩文件 解压 压缩 XML 文件读写 ...

最新文章

  1. C++:随笔7---运算符重载
  2. Java中 与,||与|的区别
  3. Python黑帽编程 3.1 ARP欺骗
  4. 配置LYNC和Exchange 2010 SP1 OWA集成
  5. jQuery源码分析系列
  6. DLL注入-APC注入
  7. 函数初识(文字总结)
  8. 数据中心变得更加灵活和可靠的五种方式
  9. 数据中心液体冷却方案正在兴起的五大原因
  10. 深度学习-人工神经网络概述
  11. 【GIF动画+完整可运行源代码】C++实现 冒泡排序——十大经典排序算法之一
  12. 559. N 叉树的最大深度
  13. background-size 兼容ie8以下浏览器的方法
  14. php debug_print_backtrace,php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
  15. 在 TMG 更新中心中使用 WSUS进行每日的定义更新
  16. Android 关于内存泄漏的一些总结
  17. 一二线城市都有哪些互联网公司是大家都想去的?
  18. 使用python进行微博登陆
  19. Codeforces C. Even Number Addicts
  20. mysql存储包含单引号英文字符串,SQL中写入包含有英文单引号“ '' ”失败问题深入详解...

热门文章

  1. shell脚本备份MySQL
  2. Excel 公式 ・快捷键 ------- 不定期更新
  3. 关于IT测试中的一些问题。
  4. 从零开始编写自己的C#框架(11)——创建解决方案
  5. Springboot使用FastJson后,接口返回中文乱码的问题解决。
  6. tomcat安装启动startup.bat文件命令行界面出现乱码的问题解决
  7. 检测到JSON.NET错误类型的自引用循环
  8. 如何将Git用于Unity3D源代码管理?
  9. 理解Rails真实性令牌
  10. 50以内的质数顺口溜_【停课不停学】学习妙招|小学数学学习中的顺口溜,记住了事半功倍!...