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