日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

qt下实现文件的拖拽打开

發(fā)布時(shí)間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt下实现文件的拖拽打开 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

此文用于記錄按下鼠標(biāo)左鍵不放,拖動(dòng)文件到程序中打開(kāi)。該示例中只設(shè)置了可以拖動(dòng)的文件類型為.h,.cpp,.txt這三種文件類型。

程序運(yùn)行的效果:

示例

下面是具體的實(shí)現(xiàn)。
項(xiàng)目的結(jié)構(gòu):

具體的實(shí)現(xiàn)代碼,如下:
main.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Dialog w;w.show();return a.exec(); }

dialog.h

#ifndef DIALOG_H #define DIALOG_H#include <QDialog>/********************************************======功能描述:=======1.實(shí)現(xiàn)文件的拖拽打開(kāi)。 ********************************************/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);//拖拽進(jìn)入void dropEvent(QDropEvent *event);//釋放拖拽的文件QString GetCorrectUnicode(const QByteArray &ba);//返回ba的UTF-8編碼的QString字符串 private:Ui::Dialog *ui; }; #endif // DIALOG_H

dialog.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);//設(shè)置不接收拖拽事件,否則會(huì)進(jìn)入該子控件的拖拽事件中 }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();//當(dāng)文件的編碼格式為GB2312編碼,采用這種方式不亂碼 // QString strContent = byteArray;//當(dāng)文件本身的編碼格式為utf-8時(shí),采用這種方式不亂碼ui->textEdit->setText(strContent);}else {qDebug()<<QStringLiteral("文件")<<filePath<<QStringLiteral("打不開(kāi)");}} }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文件的結(jié)構(gòu)

以上便是文件拖拽打開(kāi)的實(shí)現(xiàn)。
值得注意的是:
1.文件txt,.cpp,.h可能會(huì)以不同的編碼格式保存,這里函數(shù)GetCorrectUnicode(const QByteArray &ba)可以將字符串轉(zhuǎn)換為Utf-8編碼的QString字符串。所以無(wú)論是那種格式應(yīng)該都可以正常的拖拽加載到顯示文本中。
2.對(duì)于單一的編碼格式保存的文件,可以單一處理。當(dāng)文件的編碼格式為utf-8時(shí),可以直接將從文件中讀取的內(nèi)容設(shè)置到顯示文本。如:

QByteArray byteArray = file.readAll();QString strContent = byteArray;//當(dāng)文件本身的編碼格式為utf-8時(shí),采用這種方式含中文不亂碼。

當(dāng)文件保存的編碼格式為gb2312時(shí),這時(shí)可以這樣處理:

QByteArray byteArray = file.readAll(); QString strContent = QString::fromLocal8Bit(byteArray).toUtf8();//當(dāng)文件的編碼格式為GB2312編碼,采用這種方式不亂碼

可以看出還是采用將編碼格式統(tǒng)一轉(zhuǎn)換為utf-8比較方便,這樣就不用區(qū)分文件保存時(shí)的編碼格式了。
3.對(duì)于文件拖拽,首先改類必須能夠接收拖拽,也就是必須在構(gòu)造函數(shù)中設(shè)置setAcceptDrops(true);其次改類的子控件必須設(shè)置為不接受拖拽,這樣當(dāng)事件到來(lái)的時(shí)候,改類被重寫(xiě)的拖拽事件便會(huì)去處理。如果子控件沒(méi)有設(shè)置不接受拖拽,那么拖拽事件會(huì)直接在子控件的拖拽事件中處理。

總結(jié)

以上是生活随笔為你收集整理的qt下实现文件的拖拽打开的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。