轉帖|使用教程|編輯:鮑佳佳|2021-09-02 11:39:54.180|閱讀 119 次
概述:上一篇文章中主要介紹了100多個Qt開發經驗。比如qss的ANSI編碼、嵌套窗口中主窗口無法接收鼠標移動事件等。本文繼續。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
上一篇文章中主要介紹了100多個Qt開發經驗。比如qss的ANSI編碼、嵌套窗口中主窗口無法接收鼠標移動事件等。
【Qt開發主流庫:Qtitan組件集】
171. 在Qt編程中經常會遇到編碼的問題,由于跨平臺的考慮兼容各種系統,而windows系統默認是gbk或者gb2312編碼,當然后期可能msvc編譯器都支持utf8編碼,所以在部分程序中傳入中文目錄文件名稱的時候會發現失敗,因為可能對應的接口用了早期的fopen函數而不是fopen_s函數,比如fmod中也是這個情況。這個時候就需要轉碼處理。
```cpp
QString fileName = "c:/測試目錄/1.txt"; //如果應用程序main函數中沒有設置編碼則默認采用系統的編碼,可以直接通過toLocal8Bit轉成正確的數據 const char *name = fileName.toLocal8Bit().constData(); //如果設置過了下面兩句則需要主動轉碼 QTextCodec *codec = QTextCodec::codecForName("utf-8"); QTextCodec::setCodecForLocale(codec); QTextCodec *code = QTextCodec::codecForName("gbk"); const char *name = code->fromUnicode(fileName).constData(); //推薦方式2以防萬一保證絕對的正確,哪怕是設置過主程序的編碼 //切記一旦設置過QTextCodec::setCodecForLocale會影響toLocal8Bit //有時候可能還有下面這種情況 #ifdef Q_OS_WIN #if defined(_MSC_VER) && (_MSC_VER >= 1400) QTextCodec *code = QTextCodec::codecForName("utf-8"); #else QTextCodec *code = QTextCodec::codecForName("gbk"); #endif const char *name = code->fromUnicode(fileName).constData(); #else const char *name = fileName.toUtf8().constData(); #endif```
QString url = "file:///c:/1.html"; //瀏覽器控件打開本地網頁文件 webView->setUrl(QUrl(url)); //打開本地網頁文件,下面兩種方法都可以 QDesktopServices::openUrl(QUrl::fromLocalFile(url)); QDesktopServices::openUrl(QUrl(url, QUrl::TolerantMode));```
//局部的事件循環,不卡主界面 QEventLoop eventLoop; //設置超時 5.15開始自帶了超時時間函數 默認30秒 #if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) manager->setTransferTimeout(timeout); #else QTimer timer; connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit())); timer.setSingleShot(true); timer.start(timeout); #endif QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url))); connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit())); eventLoop.exec(); if (reply->bytesAvailable() > 0 && reply->error() == QNetworkReply::NoError) { //讀取所有數據保存成文件 QByteArray data = reply->readAll(); QFile file(dirName + fileName); if (file.open(QFile::WriteOnly | QFile::Truncate)) { file.write(data); file.close(); } }``
//如果是控制臺程序則下面的QApplication換成QCoreApplication //如果是quick/qml程序則下面的QApplication換成QGuiApplication int main(int argc, char *argv[]) { //可以用下面這行測試Qt自帶的輸入法 qtvirtualkeyboard qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); //設置不應用操作系統設置比如字體 QApplication::setDesktopSettingsAware(false); #if (QT_VERSION >= QT_VERSION_CHECK(6,0,0)) //設置高分屏縮放舍入策略 QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor); #endif #if (QT_VERSION > QT_VERSION_CHECK(5,6,0)) //設置啟用高分屏縮放支持 //要注意開啟后計算到的控件或界面寬度高度可能都不對,全部需要用縮放比例運算下 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); //設置啟用高分屏圖片支持 QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #endif #if (QT_VERSION > QT_VERSION_CHECK(5,4,0)) //設置opengl模式 AA_UseDesktopOpenGL(默認) AA_UseSoftwareOpenGL AA_UseOpenGLES //QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); //設置opengl共享上下文 QApplication::setAttribute(Qt::AA_ShareOpenGLContexts); #endif QApplication a(argc, argv); QWidget w; w.show(); return a.exec(); }`
====================================================
想要了解或購買Qt正版授權的朋友,歡迎
Qt技術交流群現已開通,QQ搜索群號“765444821”或者掃描下方二維碼即可加入
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: