I wrote a Qt application that drawing text, when using a certain font (Inconsolata) in small point sizes, it looked fuzzy:
But when using other font (Courier New, etc..) it's just fine:
What strange here is that other applications using that font looks normal, here is a contrast (left is vim, right is my application):
What would be the problem here?
Environment:
Window 7 Ultimate 64-bit
PySide 1.2.2 & Qt 4.8
Inconsolata.otf (http://www.levien.com/type/myfonts/inconsolata.html)
Code example (the problem is more serious on a dark scheme):
from PySide.QtGui import *
app = QApplication([])
label = QLabel('hello\nworld')
label.setStyleSheet('QLabel {background: #000; color: #fff;}')
label.setFont(QFont('Inconsolata', 11))
label.show()
app.exec_()
You can try changing the Qt font style strategy of your QFont and see what gives the best result.
For example to enable antialiasing on your application's default font, you can do:
QFont font = QApplication::font();
font.setStyleStrategy(QFont::PreferAntialias);
QApplication::setFont(font);
Related
I use C++/Qt 5.12, Windows 7 OS, Visual Studio 2017.
I'd like checkable QPushButton background to ignore checked/pressed state. I'd like to have a default background in a QPushButton instance, but only font color should be changed if the user checked the button. How can I achieve this effect?
You can use QSS (CSS with Qt's flavor) to customize QWidgets:
https://doc.qt.io/qt-5/stylesheet-syntax.html
I would recommend creating an application-wide QSS that you load at startup, and use QApplication::setStyleSheet(...). But you can use Qt Designer (right click on a specific control), or plain C++
myButton->setStyleSheet("QPushButton { background: yellow; }");
You may need to redefine border to have it visually applied, and then margins to have a correct button size, but it is fairly easy. Try experimenting from Qt Designer.
You can find a comprehensive reference of all selectors and attributes available here: https://doc.qt.io/qt-5/stylesheet-reference.html
The upper font is from a QLabel with QFont("Arial").
The lower font is rendered with QWebEngine, e.g. Chromium/Blink backend, using css
font-family: Arial, Helvetica, sans-serif;
font-size: 8pt;
Is there a way to make the blink one look as dark and sharp as the Qt one? It looks blurry and as both texts in the app are placed next to each other, it does not look good enough.
(Qt5.8 msvc 2015 on windows 8.1)
Edit
The reason is that chromium since version 52 did drop GDI support. In former version GDI rendering could be activated by disabling the DirectWrite flag. So basically I need to recompile Qt with a different chromium backend. Or perhaps with Cent Browser because it still supports that flag despite using newest chromium.
First get the font family using QFontInfo::family().
This function returns matched family name of windows system font.
QFont f("Arial");
QFontInfo info(f);
QString family = info.family();
In simple terms "QFontInfo object is used to determine the attributes of the font actually used in the window system."
Use the family name returned by QFontInfo and set the same for QWebEngine by QWebEngineSettings::setFontFamily or using CSS.
useful links:
http://doc.qt.io/qt-5/qfontinfo.html#family
http://doc.qt.io/qt-5/qwebenginesettings.html#setFontFamily
I have a Qt application that parses some JSON files and outputs its contents. I want the output to be in a monospaced font and the simplest way to do that is changing the default font of the entire application to a monospace. How do I do that in Qt?
Simply use the setFont() method on the QApplication or QWidget:
QFont font("Courier New");
font.setStyleHint(QFont::Monospace);
QApplication::setFont(font);
Note the setStyleHint(QFont::Monospace) line: it ensures that even if the specified font family is not present in the system, another suitable monospace font will be used.
Also, in my opinion it's better to set font for a certain widget, not the whole application: this gives you a more structured code for your UI in case of its expansion. However, this is still a matter of a design, of course.
The only way I have figured out to change the font for a whole application in Qt is with stylesheets. For PyQt in the application's init class you can call self.setStyleSheet('QWidget {font: "Roboto Mono"}'). Due to the cascading nature of stylesheets this will set the font of all widgets to Roboto Mono.
Just setting QApplication.setFont(font) has not always worked for me. Sometimes deeply nested child widgets do not seem to respect the font, such as headers in QTreeView.
Qt uses 9px as default font size, but users (on Linux) can change this by using qtconfig.
So, how do I get the system default font size? I read the documents, but I can not find any API.
Get a default font QFont object and read the size from it.
Your application default font can be obtained from QApplication::font(), which
Returns the default application font.
And you can gather a size of it using pointSize(),pointSizeF(),pixelSize(), etc.
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?
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
It is not currently possible. In my opinion, the most portable way would be using pts. since they are less device-dependent than pxs.
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);