轉帖|使用教程|編輯:鮑佳佳|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@ke049m.cn
文章轉載自: