<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
拖放操作分為 拖動(Drag) 和 放下(Drop) 兩種操作,當資料拖動時會被儲存為 MIME(Multipurpose Internet Mail Extensions) 型別。
下面完成將 .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型別資料處理常式
在介面上任意拖動這張圖片
圖片原來的位置蒙上黑色陰影效果
標頭檔案函數宣告
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(); } }
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); } }
到此這篇關於Qt拖放操作和列印操作的實現的文章就介紹到這了,更多相關Qt拖放操作和列印操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45