Qt拖放操作和打印操作的實現(xiàn)
1. 拖放操作
拖放操作分為 拖動(Drag) 和 放下(Drop) 兩種操作,當數(shù)據(jù)拖動時會被存儲為 MIME(Multipurpose Internet Mail Extensions) 類型。
1.1 使用拖放打開文件(拖動.txt文件)
下面完成將 .txt文件 拖如界面里的操作。
頭文件函數(shù)聲明
void dragEnterEvent(QDragEnterEvent *event); //拖動進入事件 void dropEvent(QDropEvent *event); //放下事件
源文件函數(shù)實現(xiàn)
#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()) //數(shù)據(jù)中是否包含URL event->acceptProposedAction(); //接收 else event->ignore(); //忽略 } //放下事件 void MainWindow::dropEvent(QDropEvent *event) { const QMimeData * mimeData = event->mimeData(); //獲取MIME數(shù)據(jù) 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類型數(shù)據(jù)處理函數(shù)
1.2 自定義拖放操作(拖動圖片)
在界面上任意拖動這張圖片
圖片原來的位置蒙上黑色陰影效果
頭文件函數(shù)聲明
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); //設(shè)置窗口部件可以接收拖入 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); //當窗口關(guān)閉時銷毀圖片 } MainWindow::~MainWindow() { delete ui; } //鼠標按下事件 void MainWindow::mousePressEvent(QMouseEvent *event) { //第1步:獲取圖片 //將鼠標指針所在位置的部件強制轉(zhuǎn)換為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); //將圖片信息,位置信息輸入到自己數(shù)組中 dataStream<<pixmap<<QPoint(event->pos()-child->pos()); //第3步:將數(shù)據(jù)放入QMimeData中 QMimeData *mimeData = new QMimeData; //將字節(jié)數(shù)組放入QMimeData中,這里的MIME類型是我們自己定義的 mimeData->setData("myimage/png",itemData); //第4步:將QMimeData數(shù)據(jù)放入QDrag中 QDrag *drag = new QDrag(this); //創(chuàng)建QDrag用來移動數(shù)據(jù) drag->setMimeData(mimeData); drag->setPixmap(pixmap); //在移動過程中顯示圖片,若不設(shè)置則默認顯示一個小矩形 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步:執(zhí)行拖放操作 if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction) { child->close(); //如果是移動操作,那么拖放完成后關(guān)閉原標簽 } else { child->show(); //如果是復(fù)制操作,那么拖放完成后顯示標簽 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); //當窗口關(guān)閉時銷毀圖片 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("打印預(yù)覽"),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; // 創(chuàng)建打印機對象 QPrintDialog dlg(&printer, this); // 創(chuàng)建打印對話框 // 如果編輯器中有選中區(qū)域,則打印選中區(qū)域 if (ui->textEdit->textCursor().hasSelection()) dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection); if (dlg.exec() == QDialog::Accepted) { // 如果在對話框中按下了打印按鈕 ui->textEdit->print(&printer); // 則執(zhí)行打印操作 } } void MainWindow::doPrintPreview() // 打印預(yù)覽 { QPrinter printer; QPrintPreviewDialog preview(&printer, this); // 創(chuàng)建打印預(yù)覽對話框 // 當要生成預(yù)覽頁面時,發(fā)射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("導(dǎo)出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. 資源下載
到此這篇關(guān)于Qt拖放操作和打印操作的實現(xiàn)的文章就介紹到這了,更多相關(guān)Qt拖放操作和打印操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包
這篇文章主要介紹了C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01使用QGraphicsView實現(xiàn)氣泡聊天窗口+排雷功能
這篇文章主要介紹了使用QGraphicsView實現(xiàn)氣泡聊天窗口+排雷,重點給大家介紹使用QWebEngineView控件內(nèi)嵌html+CSS的實現(xiàn)方式,需要的朋友可以參考下2022-04-04