How do you get System default font settings in Qt?

Evan picture Evan · Jun 13, 2012 · Viewed 28.4k times · Source

I am building a desktop app using Qt, my dev machine is win 7 x64 with japanese locale, standard system font is Meiryo. Most of win 7 UI is in this font, though classic/older programs such as ui font customization window itself uses different font which is MS UI Gothic. This doesn't bother me until I found that QtCreator builds my app with MS UI Gothic in one place, and Meiryo in the other. For example, qlabels, qlineedits, qcombobox all uses MS UI Gothic, but a custom completer with a qtableview i add later uses Meiryo.

I made most of the UI in QtCreator's Designer, and the completer I added in code. If I change all widgets' font to Meiryo in The Designer, then of course the app will use Meiryo therefore look right, but in this case I'd rather Qt pick whatever system's default font automatically for me because win 7 will not be the only platform I'll use this program.

What raised my concern even more is that QApplication::font() returns MS UI Gothic, which is false in my case. Of course I can set app-wide font using QApplication::setFont() but that defeats the whole purpose of having the native look-n-feel without micromanaging fonts.

So my question is,

  1. how do Qt determine system default font and,
  2. if this is a Qt Bug how do I go about getting around it?
  3. how should I use .ui files and still have my UI use default system font in runtime?

Some clarifications and facts I found

  1. I want my app to use system default font for EVERY text.

  2. This discussion said that Designer will add font info regardless whether you want it or not. So Qt will honor this info rather than system default font. At least someone mentioned removing this information manually should make Qt pick system default font in runtime.

  3. In my dev machine QApplication::font() returns WRONG default font. BUT how come a QTableView I add later in code uses RIGHT font? Where did it get this info?

So if I find where QTableView finds this info, I can get it in main, and set it app wide with QApplication::setFont(). Then what's left is manually removing all font info, then HOPEFULLY it will work. But this is like why we use Qt in the first place isn't it?

Answer

Balázs Édes picture Balázs Édes · Aug 29, 2012

I can think of two possible solution:

  1. You could pack with your application a font as a resource file, this way all platforms will use that font regardless the current systems default font.

  2. The QFont class has a method called defaultFamily(). Using this you could manually set the default font for your whole QApplication.

An example (main method):

QApplication application(argc, argv);
QFont font;
font.setFamily(font.defaultFamily());
application.setFont(font);
...rest of your code...