網(wǎng)站首頁 編程語言 正文
1. 拖放操作
拖放操作分為 拖動(Drag) 和 放下(Drop) 兩種操作,當(dāng)數(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); //鼠標(biāo)按下事件
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); //當(dāng)窗口關(guān)閉時銷毀圖片
}
MainWindow::~MainWindow()
{
delete ui;
}
//鼠標(biāo)按下事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//第1步:獲取圖片
//將鼠標(biāo)指針?biāo)谖恢玫牟考娭妻D(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()); //拖動時鼠標(biāo)指針的位置不變
//第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)閉原標(biāo)簽
}
else
{
child->show(); //如果是復(fù)制操作,那么拖放完成后顯示標(biāo)簽
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); //當(dāng)窗口關(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ù)覽對話框
// 當(dāng)要生成預(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. 資源下載
qt_ck_jb51.rar
原文鏈接:https://blog.csdn.net/weixin_38566632/article/details/124065901
相關(guān)推薦
- 2022-09-17 docker安裝postgresql的圖文教程_docker
- 2023-04-10 基于Python實現(xiàn)錄音功能的示例代碼_python
- 2022-03-28 c語言經(jīng)典習(xí)題之逆序字符串詳解_C 語言
- 2023-09-12 過擬合(over fit)和欠擬合(under fit)
- 2023-06-21 C++析構(gòu)函數(shù)內(nèi)部工作機制詳解_C 語言
- 2022-04-05 Android判斷是否Root方法介紹_Android
- 2024-01-28 使用element-ui代碼沒有提示
- 2022-11-03 C++命名空間使用詳細介紹_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支