QT程式在不同dpi下的字型自適應問題

2021-10-01 19:23:38 字數 3513 閱讀 1318

問題描述

​近日在做關於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...