問題描述
近日在做關於qt的乙個上位機專案,開發時使用的螢幕解析度為1080*1902,開發完成後,傳到筆記本上給導師展示的時候發現有些字型出現顯示不全的情況(如下圖所示),經過一番折騰,找到乙個初步解決方案,故分享出來供大家討論。
問題分析
該問題主要由於螢幕的dpi不同所致。dpi反映的是每英吋長度內的畫素個數,螢幕的dpi大,每英吋內的畫素個數多。qt中控制項的大小單位為畫素,所以在高dpi下,控制項會變小,低dpi下控制項會變大。但qt中字型的單位預設為磅,這意味著無論在什麼顯示器上顯示同一磅值的字型,其大小是不會發生變化的。所以這就造成了矛盾,本來在低dpi螢幕下開發的應用程式,在高dpi螢幕上使用時就可能因控制項變小而造成字型顯示不全的情況。
問題解決
通過上述分析,我們會很自然地想到,將字型的單位換算成畫素就可以解決該問題了。
下面給出換算公式:
pixel = dpi*point/72
其中pixel為畫素值,point為磅值,dpi為開發時所使用螢幕的dpi值,注意一定時開發使用的螢幕的dpi值而不是當前使用的螢幕的dpi值。
qt獲取螢幕dpi的方法:
:primaryscreen()
->
logicaldotsperinch()
; 下面是我針對qt應用所編寫的類,其主要功能是搜尋當前介面中指定的幾類控制項,並將文字的單位由磅轉化為畫素。
標頭檔案
#ifndef fontselfadaption_h
#define fontselfadaption_h
#include
/** * @brief 該類主要用於解決因dpi不同導致的字型顯示不全問題,目前支援對label、groupbox、radiobutton、
* tablewidget、qcombobox、qpushbutton中字型的轉化,如有其他控制項需求,可在selfadaption中自
* 行新增
*/class fontselfadaption
;#endif
// fontselfadaption_h
原始檔
#include
"fontselfadaption.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* 建構函式,輸入當前widget指標,一般為this,以及開發時螢幕的dpi
*/fontselfadaption:
:fontselfadaption
(qwidget *widget,
double dpi)
void fontselfadaption:
:setdpiofdevelopmentpc
(double dpi)
double fontselfadaption:
:getdpiofdevelopmentpc()
double fontselfadaption:
:getdpiofthispc()
inline
double fontselfadaption:
:pointtodpipixel
(int fontpointsize)
/** * @brief fontselfadaption::selfadaption 該函式用於將字型大小單位由磅轉化為畫素,如果控制項之間有包含關係,請先轉化父控制項,再轉化子控制項;
*/void fontselfadaption:
:selfadaption()
else
if(objectlist.
at(i)
->
inherits
("qlabel"))
else
if(objectlist.
at(i)
->
inherits
("qcombobox"))
else
if(objectlist.
at(i)
->
inherits
("qpushbutton"))
else
if(objectlist.
at(i)
->
inherits
("qradiobutton"))
else
if(objectlist.
at(i)
->
inherits
("qtablewidget"))
else
if(objectlist.
at(i)
->
inherits
("qlineedit"))
}//對子控制項進行排序,包含其他控制項的控制項放在前面,防止qss被覆蓋
widgetvector.
(groupboxvector)
; widgetvector.
(labelvector)
; widgetvector.
(combovector)
; widgetvector.
(buttonvector)
; widgetvector.
(radiovector)
; widgetvector.
(lineeditvector)
; qvector<
double
>widgetpixelvector;
for(
int i=
0;isize()
;i++
)for
(int i =
0; i
size()
;i++
)//牽扯到表頭,對**單獨處理
for(
int i =
0;isize()
;i++
)}
程式使用說明
fontselfadaption f
(this,dpi)
;//this為當前widget的指標,dpi為開發時所有螢幕的dpi
f.selfadaption()
;
結果與問題
通過處理後的介面如下圖所示
由此可以看到文字已經可以完全顯示了,但是也存在著字型變小的問題,如果各位對該問題有更好的解決方法,可以一起討論。
QT程式在不同解析度電腦上字型變大,溢位控制項
效果最近開發過程中,發現在本地執行qt程式,顯示介面是沒有問題的,但是在其他電腦上出現過字型變大,溢位控制項的現象。qt中的字型qfont定義字型大小是有兩種方式,一種是pointsize,另一種是pixelsize。開發過程中,qt預設使用的是pointsize的設定方法,所以在不同解析度電腦下的...
在IDE(VC )下開發Qt程式
以ms visual studio為例。在專案的原始碼目錄下建立乙個generatedfiles資料夾,然後在visual studio中為專案新建乙個篩選器generated files。選擇需要使用qt元物件編譯器 moc.exe 進行編譯的乙個標頭檔案 假設這個檔案為mainwindow.h ...
C 在不同編譯下的不同表現
這是我在2018年的時候發在unity forums上的帖子,至今無人回覆,之前是想用typedreference做datatable的相關功能的,可是結果不正確.tiancaiwrk,oct 18,2018 c has some way to get generic type target poi...