Qt5 10中乙個關於QList的怪異問題

2021-08-19 17:32:10 字數 1260 閱讀 4202

先看乙個例子**,首先是專案檔案qhash.pro,只有一行。

sources += main.cpp
然後是程式檔案main.cpp,

#include #include class q_decl_export pointlist : public qlist;

int main(int argc, char *argv)

在qt5.10.1 + v2015的環境下編譯,報錯:

error: c2665: 「qhash」: 25 個過載中沒有乙個可以轉換所有引數型別 ....

首先一點,這個錯誤沒有問題,qt的原始碼中確實沒有實現關於qpointf的qhash函式。

但是詭異的是,因為剛從qt4遷移到qt5的環境中,而同樣的程式在qt4.8.4的環境中是沒有錯誤的,只有一堆警告,

warning: c4661: 「qsetqlist::toset(void) const」: 沒有為顯式模板例項化請求提供適當的定義

with

[    t=qpointf  

]注: 這裡的意思是qlist中的toset函式,返回qset型別的物件,但例項化qset時,沒有找到qset的定義。但是因為實際沒有使用toset這個函式,所以只是給出了警告資訊。

這是什麼原因呢?個人覺得非常奇怪。通過查詢qt的原始碼發現,在qt5.10的include目錄下,包含了兩個qlist檔案,乙個在qtcore目錄下,另乙個在qtgui的目錄下,因為我這個專案檔案中沒有 qt -= gui,所以預設是包含了gui模組,這裡的#include指令找到的是qtgui目錄下的qlist檔案,怪異的是,這個檔案的內容如下:

#include "qevent.h"
不符合qt標頭檔案的慣例,而qtcore模組下的檔案就是合理的。

#include "qlist.h"
而正式這個不合常理的qlist檔案,間接include了qset類的定義,所以編譯的時候就不是警告資訊,而是直接給出了錯誤。

這裡猜測是qtgui中的qlist檔案內容錯誤,或者這個檔名根本不應該是qlist,而應該改名為qevent。這應該是qt的乙個bug,在qt的bug系統中也有相關的問題。

經過驗證,把qt目錄下的include/qtgui/qlist檔案改名未qevent,上面的程式編譯沒有錯誤,和4.8環境一樣給出了一組警告資訊。

關於Qt5 10的UI中自己做的示波器控制項問題

最近自己造輪子,基於qlabel做了乙個類似於示波器的顯示介面,如下圖,做完之後我把它作為乙個控制項,可以在ui設計介面將qlabel提公升為這個圖表型別,這個過程中我遇到了乙個問題,就是提公升後的控制項的大小設定出現了異常,不能根據介面大小跟隨layout變化 我重寫了resizeevent 也不...

關於Android中乙個Activity的啟動過程

所有的應用都是在launcher的基礎上執行起來的,具體如下 1.launcher會向activitymanagerservice ams 傳送乙個啟動mainactivity的請求 2.ams在接到請求後,會將mainactivity的資訊儲存下來,然後向launcher傳送乙個進入中止狀態的程序...

乙個關於oracle日誌中乙個小點的總結

下午巡檢oracle資料庫,在檢視alert log時發現乙個沒見過的東西,如下 logminer krvxpsr summary for session 2147483905 logminer startscn 0 logminer endscn 0 logminer highconsumedsc...