qt下实现文件的拖拽打开
生活随笔
收集整理的這篇文章主要介紹了
qt下实现文件的拖拽打开
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引言
此文用于記錄按下鼠標左鍵不放,拖動文件到程序中打開。該示例中只設置了可以拖動的文件類型為.h,.cpp,.txt這三種文件類型。
程序運行的效果:
示例
下面是具體的實現。
項目的結構:
具體的實現代碼,如下:
main.cpp
dialog.h
#ifndef DIALOG_H #define DIALOG_H#include <QDialog>/********************************************======功能描述:=======1.實現文件的拖拽打開。 ********************************************/QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog(); protected:void dragEnterEvent(QDragEnterEvent *event);//拖拽進入void dropEvent(QDropEvent *event);//釋放拖拽的文件QString GetCorrectUnicode(const QByteArray &ba);//返回ba的UTF-8編碼的QString字符串 private:Ui::Dialog *ui; }; #endif // DIALOG_Hdialog.cpp
#include "dialog.h" #include "ui_dialog.h" #include <QDragEnterEvent> #include <QMimeData> #include <QFile> #include <QTextCodec> #include <QDebug>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {ui->setupUi(this);setAcceptDrops(true);ui->textEdit->setAcceptDrops(false);//設置不接收拖拽事件,否則會進入該子控件的拖拽事件中 }Dialog::~Dialog() {delete ui; }void Dialog::dragEnterEvent(QDragEnterEvent *event) {if (event->mimeData()->hasUrls()) {event->acceptProposedAction();}else {event->ignore();} }void Dialog::dropEvent(QDropEvent *event) {if (event->mimeData()->hasUrls() && (event->mimeData()->urls()[0].fileName().right(3).compare("cpp") == 0|| event->mimeData()->urls()[0].fileName().right(3).compare("txt") == 0|| event->mimeData()->urls()[0].fileName().right(1).compare("h") == 0)) {const QList<QUrl> urls = event->mimeData()->urls();QString filePath = urls.at(0).toLocalFile();QFile file(filePath);if (file.open(QIODevice::ReadOnly)) {QByteArray byteArray = file.readAll();QString strContent = GetCorrectUnicode(byteArray);//返回utf-8編碼的字符串QString // QString strContent = QString::fromLocal8Bit(byteArray).toUtf8();//當文件的編碼格式為GB2312編碼,采用這種方式不亂碼 // QString strContent = byteArray;//當文件本身的編碼格式為utf-8時,采用這種方式不亂碼ui->textEdit->setText(strContent);}else {qDebug()<<QStringLiteral("文件")<<filePath<<QStringLiteral("打不開");}} }QString Dialog::GetCorrectUnicode(const QByteArray &ba) {QTextCodec::ConverterState state;QTextCodec *codec = QTextCodec::codecForName("UTF-8");codec->toUnicode( ba.constData(), ba.size(), &state);if (state.invalidChars > 0){return QTextCodec::codecForName( "GBK" )->toUnicode(ba);}else{return ba;} }ui文件的結構
以上便是文件拖拽打開的實現。
值得注意的是:
1.文件txt,.cpp,.h可能會以不同的編碼格式保存,這里函數GetCorrectUnicode(const QByteArray &ba)可以將字符串轉換為Utf-8編碼的QString字符串。所以無論是那種格式應該都可以正常的拖拽加載到顯示文本中。
2.對于單一的編碼格式保存的文件,可以單一處理。當文件的編碼格式為utf-8時,可以直接將從文件中讀取的內容設置到顯示文本。如:
當文件保存的編碼格式為gb2312時,這時可以這樣處理:
QByteArray byteArray = file.readAll(); QString strContent = QString::fromLocal8Bit(byteArray).toUtf8();//當文件的編碼格式為GB2312編碼,采用這種方式不亂碼可以看出還是采用將編碼格式統一轉換為utf-8比較方便,這樣就不用區分文件保存時的編碼格式了。
3.對于文件拖拽,首先改類必須能夠接收拖拽,也就是必須在構造函數中設置setAcceptDrops(true);其次改類的子控件必須設置為不接受拖拽,這樣當事件到來的時候,改類被重寫的拖拽事件便會去處理。如果子控件沒有設置不接受拖拽,那么拖拽事件會直接在子控件的拖拽事件中處理。
總結
以上是生活随笔為你收集整理的qt下实现文件的拖拽打开的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb php代码实例,php操
- 下一篇: java maven导入导出_Java