Qt拖放操作和打印操作的实现
时间:2022-08-17 14:53:51|栏目:C代码|点击: 次
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()) //数据中是否包含URL event->acceptProposedAction(); //接收 else event->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_OBJECT public: 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"); // 如果文件后缀为空,则默认使用.pdf QPrinter printer; printer.setOutputFormat(QPrinter::PdfFormat); // 指定输出格式为pdf printer.setOutputFileName(fileName); ui->textEdit->print(&printer); } }
3. 资源下载
上一篇:C++线性表深度解析之动态数组与单链表和栈及队列的实现
栏 目:C代码
本文标题:Qt拖放操作和打印操作的实现
本文地址:http://www.codeinn.net/misctech/211036.html