網站首頁 編程語言 正文
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. 資源下載
qt_ck_jb51.rar
原文鏈接:https://blog.csdn.net/weixin_38566632/article/details/124065901
相關推薦
- 2022-06-20 .NET?Core企業微信網頁授權登錄的實現_實用技巧
- 2022-04-01 ?python中pandas讀取csv文件?時如何省去csv.reader()操作指定列步驟_pyt
- 2022-04-18 python接口測試返回數據為字典取值方式_python
- 2022-08-31 ASP.NET?Core中的對象池介紹_實用技巧
- 2022-08-26 .net任務調度框架FluentScheduler簡介_實用技巧
- 2022-05-06 Python?ORM框架之SQLAlchemy?的基礎用法_python
- 2023-04-26 Numpy對于NaN值的判斷方法_python
- 2022-07-16 四種解決Nginx出現403 forbidden 報錯的方法
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支