亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                Qt開發(fā)經(jīng)驗小技巧226-230

                226. qtc開發(fā)工具內(nèi)置了不少的函數(shù),可以很方便的進行一些判斷和處理。

                “`cpp

                //最小版本要求

                !minQtVersion(5, 15, 2) {

                message(“Cannot build Qt Installer Framework with Qt version ${QT_VERSION}.”)

                error(“Use at least Qt 5.15.2.”)

                }

                “`

                227. 有時候文本框中的內(nèi)容過長,而文本框默認光標在尾部,所以要主動設(shè)置下將光標移到最前面

                “`cpp

                //三種方法都可以

                ui->lineEdit->setSelection(0, 0);

                ui->lineEdit->setCursorPosition(0);

                //樣式表方式

                “QLineEdit{qproperty-cursorPosition:0;}

                “`

                228. 關(guān)于Qt瀏覽器模塊的幾點說明。

                – Qt5.6以前用的是webkit,Qt5.6版本以后分兩種情況,一種是mingw編譯器(windows系統(tǒng))對應(yīng)的Qt庫不再提供瀏覽器模塊。

                – Qt5.6以后的版本在linux系統(tǒng)和mac等系統(tǒng),都不存在沒有瀏覽器控件的情況,都使用的是webengine。

                – 僅僅是windows上的mingw編譯器的Qt版本沒有,其他系統(tǒng)其實都有的。很多人在這個地方都有疑問,都以為只有msvc編譯器有瀏覽器控件,其實確切的說是在windows上msvc的Qt庫帶瀏覽器控件。

                – 安裝Qt的時候webengine模塊默認不勾選,需要主動勾選才會安裝。

                – 也不是所有的msvc的Qt版本都有webengine瀏覽器模塊,哪怕你勾選了也沒用,有些版本官方并沒有編譯,需要自行編譯。需要到對應(yīng)的Qt安裝目錄查看是否有 Qt5WebEngine.dll 文件。

                – 如果僅僅是為了彌補mingw版本缺失瀏覽器模塊的遺憾,推薦用miniblink。

                – 如果為了統(tǒng)一兼容各種版本和系統(tǒng),推薦用cef。

                – 如果沒有歷史包袱,推薦用webengine,與Qt的集成度高。

                – webkit和miniblink默認都不支持gpu,webengine默認走gpu。

                – qwebengine默認不支持MP4,需要自己重新編譯。

                229. 關(guān)于編譯數(shù)據(jù)庫插件的幾個經(jīng)驗總結(jié)。

                – 安裝對應(yīng)的數(shù)據(jù)庫,安裝后會有include頭文件和lib鏈接庫文件,這是基本的前提,編譯數(shù)據(jù)庫插件必須要有這兩個東西。務(wù)必注意,32位的Qt必須安裝32位的數(shù)據(jù)庫才能正常編譯成功,位數(shù)要一致。

                – 準備好數(shù)據(jù)庫插件源碼,比如qt-everywhere-src-5.14.2qtbasesrcpluginssqldriversmysql,可以在安裝Qt的時候勾選src,或者后期直接官網(wǎng)重新下載源碼解壓出來。

                – 打開你要編譯的數(shù)據(jù)庫插件源碼,比如mysql就打開mysql.pro,oracle就打開oci.pro。

                – 在pro中注釋掉一行 #QMAKE_USE += mysql,如果是oci項目則是#QMAKE_USE += oci。

                – qsqldriverbase.pri文件中注釋掉 #include(..shadowed(..PWD)/qtsqldrivers-config.pri)。

                – mysql.pro文件內(nèi)容下面加上如下代碼。

                “`cpp

                path = C:/Qt/mysql-5.7.30-winx64

                INCLUDEPATH += $path/include

                win32:LIBS += -L$path/lib -llibmysql

                “`

                – oci.pro文件內(nèi)容下面加上如下代碼。

                “`cpp

                path = C:/app/Administrator/product/11.2.0/client_1

                INCLUDEPATH += $path/oci/include

                win32:LIBS += -L$path/oci/lib/msvc -loci

                “`

                – psql.pro文件內(nèi)容下面加上如下代碼。

                “`cpp

                path = “C:/Program Files/PostgreSQL/13”

                INCLUDEPATH += $path/include

                win32:LIBS += -L$path/lib -llibpq

                “`

                – 以上寫法同時支持mingw和msvc,其他系統(tǒng)編譯過程也是類似。編譯完成后默認會在你當(dāng)前源碼所在盤符的根目錄下,會出現(xiàn)plugins目錄,里面sqldrivers目錄下就是對應(yīng)編譯生成好的插件動態(tài)庫。

                – 默認oracle的插件驅(qū)動代碼是按照oracle12的函數(shù)寫的,如果鏈接的是oracle11,則需要改動兩行代碼才能編譯成功。打開qsql_oci.cpp文件大概在1559行代碼左右,有個OCIBindByPos2函數(shù)改成OCIBindByPos,下面還有一行bindColumn.lengths改成(ub2*)bindColumn.lengths。

                230. 關(guān)于Qt數(shù)據(jù)庫開發(fā)的一些冷知識。

                – Qt即支持庫的形式直接和數(shù)據(jù)庫通信,也支持ODBC數(shù)據(jù)源的形式和各種數(shù)據(jù)庫通信,這樣就涵蓋了所有的情況。

                – Qt數(shù)據(jù)庫程序打包發(fā)布,所有前提:注意區(qū)分32/64位,你的程序是32位的就必須帶上32位的庫,64位的必須帶上64位的庫,這點Qt的庫也是這個要求。mysql發(fā)布最簡單,帶上一個mysql的動態(tài)庫文件就行(windows上的是libmysql.dll),非常簡單。sqlserver不用帶,因為是微軟的親兒子,一般操作系統(tǒng)自帶。postgres需要帶上libpq.dll、libintl-8.dll、libiconv-2.dll、libeay32.dll、ssleay32.dll這幾個文件就行。oracle需要帶上oci.dll、oraociei11.dll(這個文件很大有130MB+),如果不行建議直接安裝個oracle client客戶端軟件,然后對應(yīng)bin目錄設(shè)置到環(huán)境變量就好。

                – 打包發(fā)布后測試下來,發(fā)現(xiàn)32位的程序也可以正常連接64位的mysql,64位的程序也可以正常連接32位的mysql,因此判斷只要和程序的庫的位數(shù)一致就行(編譯的時候也是這個規(guī)則,32位的Qt程序編譯數(shù)據(jù)庫插件也要用32位的數(shù)據(jù)庫鏈接庫。),不需要和具體的數(shù)據(jù)庫的位數(shù)一致,測試過mysql、sqlserver、postgresql數(shù)據(jù)庫都是類似規(guī)則。

                – 大量測試對比下來,通過odbc數(shù)據(jù)源的方式和直連數(shù)據(jù)庫的方式批量插入大量數(shù)據(jù)記錄,直連方式速度更快,約5%左右,所以建議盡量采用此方式,是在沒有此方式的環(huán)境才采用odbc數(shù)據(jù)源的方式,Qt默認自帶odbc數(shù)據(jù)庫插件。

                – 不同數(shù)據(jù)庫在執(zhí)行sql腳本的時候,會自動將表名或者字段名轉(zhuǎn)成大寫或小寫,mysql會將表名轉(zhuǎn)成小寫、postgresql會將表名和字段名轉(zhuǎn)成小寫、oracle會將表名和字段名轉(zhuǎn)成大寫。這就導(dǎo)致使用QSqlTableModel調(diào)用setTable設(shè)置數(shù)據(jù)庫表名的時候,一定要和數(shù)據(jù)庫中的表名一致,區(qū)分大小寫,所以就是在對postgresql和oracle數(shù)據(jù)庫的時候一定要注意,本人就是在這里卡了很久,差點要把這巨大的屎盆扣在Qt的BUG上。

                “`cpp

                void DbHelper::bindTable(const QString &dbType, QSqlTableModel *model, const QString &table)

                {

                //postgresql全部小寫,oracle全部大寫,這兩個數(shù)據(jù)庫嚴格區(qū)分表名字段名的大小寫臥槽

                QString flag = dbType.toUpper();

                if (flag == “POSTGRESQL”) {

                model->setTable(table.toLower());

                } else if (flag == “ORACLE”) {

                model->setTable(table.toUpper());

                } else {

                model->setTable(table);

                }

                }

                “`

                – Qt支持不指定數(shù)據(jù)庫名打開數(shù)據(jù)庫,因為有時候是要在連接數(shù)據(jù)庫服務(wù)器后,執(zhí)行sql語句創(chuàng)建數(shù)據(jù)庫。數(shù)據(jù)庫都還沒存在怎么連接呢,測試發(fā)現(xiàn)sqlite、mysql、sqlserver、postgresql都支持這個特性。在刪除和創(chuàng)建數(shù)據(jù)庫的前提是該數(shù)據(jù)庫沒有被其他程序占用,比如其他程序已經(jīng)打開了該數(shù)據(jù)庫則會執(zhí)行失敗。這里我就折磨過很多次,為什么執(zhí)行失敗呢?后面發(fā)現(xiàn)第三方數(shù)據(jù)庫工具已經(jīng)打開了該數(shù)據(jù)庫,把工具關(guān)掉就ok了。

                “`cpp

                QSqlDatabase database = QSqlDatabase::addDatabase(“QMYSQL”);

                //database.setDatabaseName(“dbtool”);

                database.setHostName(“127.0.0.1”);

                database.setPort(3306);

                database.setUserName(“root”);

                database.setPassword(“root”);

                if (database.open()) {

                QSqlQuery query(database);

                qDebug() << "刪除數(shù)據(jù)庫" << query.exec("drop database dbtool");

                qDebug() << "創(chuàng)建數(shù)據(jù)庫" << query.exec("create database dbtool");

                if (query.exec(“select * from userinfo”)) {

                while (query.next()) {

                qDebug() << "查詢數(shù)據(jù)庫" << query.value(0);

                }

                }

                } else {

                qDebug() << "打開數(shù)據(jù)庫" << database.lastError().text();

                }

                “`

                – 用QSqlQueryModel+QTableView顯示數(shù)據(jù),int類型的數(shù)據(jù),如果超過100萬,會變成科學(xué)計數(shù)顯示,這就很惱火了,肯定不是自己想要的結(jié)果。找遍網(wǎng)絡(luò)搜索,終于找到一個同樣問題的哥們,需要對這一列加個空的委托就行。后面發(fā)現(xiàn)空委托也不行,超過1000萬條又屌樣了,需要終極大法重載數(shù)據(jù)模型顯示。

                “`cpp

                ui->tableView->setItemDelegateForColumn(0, new QItemDelegate);

                //下面是終極大法

                QVariant SqlQueryModel::data(const QModelIndex &index, int role) const

                {

                QVariant value = QSqlQueryModel::data(index, role);

                //超過100萬的數(shù)值會被科學(xué)計數(shù)顯示需要這里轉(zhuǎn)成字符串顯示

                if (role == Qt::DisplayRole) {

                int result = value.toInt();

                if (result >= 1000000) {

                value = QString::number(result);

                }

                }

                return value

                }

                “`

                – mysql數(shù)據(jù)庫有多種數(shù)據(jù)庫引擎,其中MyIsam不支持數(shù)據(jù)庫事務(wù),默認一般是這個引擎,所以當(dāng)你使用Qt中的transaction方法后commit提交時候,會發(fā)現(xiàn)不成功,其實事實上又是成功的,去數(shù)據(jù)庫里面查看對應(yīng)的結(jié)果又是正確的。有兩個辦法,第一就是將數(shù)據(jù)庫引擎改成InnoDB,第二就是在提交后做個錯誤判斷 if (database.commit() || !database.lastError().isValid()) ,錯誤不可用也說明是成功的。

                – 如果采用odbc數(shù)據(jù)源通信,則只需設(shè)置數(shù)據(jù)庫名稱setDatabaseName、設(shè)置用戶名稱setUserName、設(shè)置用戶密碼setPassword這三個參數(shù)即可,因為數(shù)據(jù)源配置的時候就已經(jīng)設(shè)置好對應(yīng)的主機地址和端口以及關(guān)聯(lián)的數(shù)據(jù)庫名稱,所以在用odbc數(shù)據(jù)源通信的時候只需要再次驗證用戶信息即可。這里特別要注意的是setDatabaseName設(shè)置數(shù)據(jù)庫名稱要填寫數(shù)據(jù)源配置的名稱。

                – 經(jīng)過大量的對比測試,包括插入、刪除、批量、查詢、分頁等操作,千萬量級數(shù)據(jù),在Qt數(shù)據(jù)庫部分響應(yīng)速度這塊,友好度排名依次是 sqlite > postgresql > oracle > mysql > odbc 。千萬量級以上是 postgresql > oracle > mysql > sqlite > odbc 。億級別以上是 oracle > postgresql > 其他。以上測試均建立在初學(xué)者水平基礎(chǔ)上,至于分庫分表、聯(lián)合查詢、緩存、內(nèi)存數(shù)據(jù)庫等各種高級知識點沒用上。

                – mysql主要有兩個版本,mysql5.7和mysql8,官方說是8比5要快很多,個人測試下來,5.7比8要快很多,無論是查詢,還是批量插入數(shù)據(jù),不知道為何,網(wǎng)上搜索的也是這個結(jié)果([https://www.coder4.com/archives/7596](https://www.coder4.com/archives/7596)),大家都說8慢了很多。

                – mysql有個分支叫mariadb,比mysql更純正,據(jù)說各方面都吊打mysql([https://blog.csdn.net/x275920/article/details/123847792](https://blog.csdn.net/x275920/article/details/123847792)),個人對比測試下來也是確實批量插入和查詢性能要好不少,并且完全兼容mysql,甚至庫文件直接重命名也可以直接使用,比如將libmariadb.dll改成libmysql.dll可以直接使用,而且體積還小了八倍,這個好,發(fā)布的時候又少了好幾兆。

                – 如果是Qt+mysql程序,發(fā)布的時候帶的庫版本要和插件對應(yīng)數(shù)據(jù)庫版本一致,否則可能沒有數(shù)據(jù)庫事務(wù)特性,database.driver()->hasFeature(QSqlDriver::Transactions)為假。

                – QSqlTableModel封裝的非常好,并不會一次性加載所有數(shù)據(jù),而是隨著滾動條的拉動加載需要的數(shù)據(jù),測試一億條的表,速度非???,和幾千條的表速度一樣。

                – 在連接網(wǎng)絡(luò)數(shù)據(jù)庫的時候,如果你本地網(wǎng)絡(luò)設(shè)置了代理,比如使用了代理上github等網(wǎng)站,就會發(fā)現(xiàn)Qt的數(shù)據(jù)庫程序連不上,你需要設(shè)置下不使用本地代理設(shè)置 QNetworkProxyFactory::setUseSystemConfiguration(false) 。這個地方如果不仔細會找問題找到你懷疑人生。

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年7月5日 17:57
                下一篇 2022年7月5日 17:57

                相關(guān)推薦

                • 原神3.1版本前瞻匯總,散兵的“高達”有點帥,原神動畫化確定!

                  我已經(jīng)有過一次旅行。所以,你也要像我一樣抵達終點,才能在自己的眼中,留下這個世界的沉淀。大家好,我是boyue,感謝打開這篇原神游戲文。boyue會經(jīng)常分享一些原神資訊與攻略給大家…

                  2022年11月27日
                • 《云頂之弈》s8什么時候上線國服?s8國服上線時間介紹

                  云頂之弈的s8版本為怪物來襲版本,現(xiàn)已正式在美測服上線了。很多小伙伴可能還不清楚該版本什么時候在國服上線吧,今天小編給大家?guī)碓祈斨膕8國服上線時間介紹,快來看一下吧。 s8國服…

                  2022年11月25日
                • 淘寶直播平臺抽成多少(淘寶直播平臺抽成比例)

                  隨著時代的發(fā)展,現(xiàn)在直播帶貨已經(jīng)成為主要帶貨方式,其中淘寶是主流帶貨平臺,不少人在上面直播帶貨賺錢,一些小伙伴也想加入,那么淘寶直播平臺抽成多少?下面小編為大家?guī)硖詫氈辈テ脚_抽成…

                  2022年11月24日
                • 科比19歲女兒遭自稱與她生“科比式孩子”男子跟蹤騷擾

                  極目新聞記者王亮亮黃佳琪 據(jù)??怂剐侣劸W(wǎng)報道,當(dāng)?shù)貢r間11月21日,已故籃球巨星科比·布萊恩特的長女娜塔莉亞·布萊恩特21日向法院提交臨時限制令,聲稱這位32歲的前科從十幾歲起就騷…

                  2022年11月24日
                • vivox90和x90pro/x90pro+區(qū)別差距多大 參數(shù)配置對比評測

                  vivox90系列的賣點有很多,它是首款搭載天璣9200處理器的手機,擁有蔡司一英寸T主攝和自研的V2芯片。那么vivox90、vivox90pro和vivox90pro+有什么區(qū)…

                  2022年11月24日
                • 今天出入濟南最新通知(出入濟南政策最新消息今天)

                  近日濟南疫情感染人數(shù)也在不斷增加,劃分的高風(fēng)險區(qū)也是越來越多了。據(jù)最新統(tǒng)計,截止2022年11月24日11時,濟南共有低風(fēng)險地區(qū)12處,高風(fēng)險地區(qū)338處。很多朋友都擔(dān)心現(xiàn)在濟南無…

                  2022年11月24日
                • 免費清理c盤的軟件(清理c盤空間不影響系統(tǒng))

                  電腦用久了慢如龜速,還卡頓,這最大的原因啊就是C盤空間不足造成的。 即使電腦配置再好,或者硬盤再快,如果長時間沒有打掃C盤,打開文件或者穩(wěn)定之類的,都卡得讓人頭大。 這時候呢不要去…

                  2022年11月24日
                • 華為手機怎么掃一掃連接wifi(手機掃一掃在哪里)

                  手機瀏覽器可以用來瀏覽網(wǎng)頁、看新聞、看視頻,還能搜索問題,在我們的工作生活中瀏覽器占據(jù)著非常重要的位置。手機瀏覽器除了這些作用,其實它隱藏著其他功能,比如:掃一掃。掃一掃可不只是用…

                  2022年11月24日
                • 白襯衫搭配什么褲子好看,女生襯衫穿法圖片

                  說起白襯衫和長褲的搭配組合,不知道大家有沒有發(fā)現(xiàn),雖然是很常見的造型,可不同年齡段慣用的穿搭方式卻不相同,從而也穿出了不同的味道。簡直是現(xiàn)在這個季節(jié),時髦精們的必備造型之一~ 70…

                  2022年11月24日
                • pdf虛擬打印機(添加pdf虛擬打印機)

                  本文主要講的是pdf虛擬打印機,以及和添加pdf虛擬打印機相關(guān)的知識,如果覺得本文對您有所幫助,不要忘了將本文分享給朋友。 pdf虛擬打印機具體是什么功能? 電腦虛擬打印機的功能有…

                  2022年11月24日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時間:周一至周五,10:30-18:30,節(jié)假日休息