Relative font sizes in QT or the most portable way

2019-06-25 04:58发布

问题:

Coming from a Web Development background I am now into QT Applications development.

Working with QFonts I have seen that I have only two options apparently, to define fonts sizes in QT; either by pixel size, or point size.

When making web layouts I am used to define all my fonts in a relative way... using em units which refer to the inherited font size, where 1em equals the font-size of the container element, 0.5em 50% the font-size, 1.5em 50% bigger, and so on.

I am worried about portability and device/OS idenpendence of my applications. Is there any better way to define these fonts or should I instead stick to one of these methods? If possible, can I inherit font-sizes and define sizes in relative units such as ems or percentages?

回答1:

Depending on how you design your application, I'm afraid that as well as worrying about font size, you will also need to be very careful about platform-specific fonts.

For example, I've just run Qt Designer, inside Qt Creator 2.3.0 (Based on Qt 4.7.4) - so pretty much the latest stable code, and done the following:

  • Created a new Qt Designer form (i.e. a .ui file)
  • Made it an empty Widget
  • Added a QTextEdit (this is called "Text Edit" in Designer's "Input Widgets" section)
  • Double-clicked on the QTextEdit, to open its properties
  • Viewed its Source

This is what I see:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;">
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>

Note the use of Windows-specific font, and a very hard-coded size, before I've even made any changes to the content: font-family:'MS Shell Dlg 2'; font-size:7.8pt;

I've previously reported this to Qt's user support, and been told (via the status of the bug) that there there are no plans to fix it. (See Edit below, for info on these bugs)

So at work, every release, we have to search through all our .ui files, to make sure that no platform-specific font info has crept in to any .ui file since the previous release.

(A year or two ago, I ran Designer on each of Mac, Windows and Linux, and showed that each version generated its own platform-specific font info like this, and very different default font sizes. Each failed to display correctly on the other two platforms! The Mac text was way too large on the other two, and the other two were way too small on the Mac)

I really like Qt a lot, but I find this lack of platform independence in something so basic as its UI designer rather frustrating.

Edit - bug info from TrollTech, July 2009

I've found the info from when I reported '.ui cross-platform problems - portability of fonts and sizes'. I don't know how these old references numbers, from TrollTech in July 2009, translate to current Qt issue-tracking: I'm hoping someone else might be able to update the links, to current working ones:

  • TrollTech support ticket: N258723
  • Want to specify relative sizes for QLabels, with using platform-specific fixed sizes:
    • [broken link] http://www.trolltech.com/developer/task-tracker/index_html?method=entry&id=241089
  • How can we stop Qt Designer putting in platform-specific font names and font sizes in future?
    • [broken link] http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=153335


回答2:

It is not currently possible. In my opinion, the most portable way would be using pts. since they are less device-dependent than pxs.



回答3:

in qt3, the next code works at least for fixed fonts:

QFont f=font();
int psz=f.pixelSize();
if (psz>0) f.setPixelSize(psz*6/5);
else f.setPointSizeFloat(f.pointSizeFloat()*1.2);