Disabling antialiasing when drawing fonts in Qt 4.8.x

When you draw text in Qt using QPainter and desire it to be pixel crisp and sharp, you might do something like this:

QPainter painter(&this);
painter.setRenderHint(QPainter::TextAntialiasing, false);
painter.drawText(this.rect(), "Some Text");
Qt 4.8.x QPainter drawing text with default anti-aliasing on
Qt 4.8.x QPainter drawing text with default anti-aliasing on

However, sometimes it doesn’t work. Your text might be drawn with antialiasing no matter what, which results in soft blurry sometimes ugly font. Continue reading “Disabling antialiasing when drawing fonts in Qt 4.8.x”

Knowing when to use [ ] vs .at( ) in Qt to read vs write data to objects

Knowing when to use [ ] vs .at( ) in Qt to read vs write data to objects

In Qt c++, you can directly access members of an object, whether it’s a class or struct, by using the square brackets [ and ] after the name of the object. For example:

classObject[0].classMember

Using square brackets [ and ] on an object allows you to directly READ AND WRITE to the member. However, knowing the difference between WHEN to use it could help increase the performance of the data handling cycles. In order to directly access that member data, and to allow read AND write access, Qt has to create a new pointer to the object itself in memory to do so. And creating pointers costs a lot of memory. And if you’re dealing with hundreds of thousands of objects and their hundreds of members, then things can get sluggish. Continue reading “Knowing when to use [ ] vs .at( ) in Qt to read vs write data to objects”

3D Graphics Performance Optimization Techniques

Although the tips in the following link are only concerning DirectX9, it may still be useful in Qt:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb147263(v=vs.85).aspx

Notably:

  • Only redraw to the image buffer when you need to
  • Use smaller textures
  • Draw objects from front to back
  • Constantly test your code’s performance
  • Use one large array/buffer of vertices
  • Draw only what needs to be drawn, so culling and z-ordering can only help more

The ideal is to get a higher framerate which is perceivably better experience for the user. For 2D graphics, 16 frames per second is satisfactory. But for 3D graphics, 30 frames per second seems to be tolerable, but 60 frames per second is the minimal. But if you’re just learning 3D graphics programming, don’t worry about frames per second, just worry about the geometry and math to make sure it is correct. Then you can optimize it when you’re confident you understand how it all works.

Windows 10 drops support for Qt 4.8.x after Qt.4.8.6

The main reason I had to rollback to using Qt 4.8.5 since I was developing on Qt 4.8.7 on a Windows 7 machine was because after upgrading to Windows 10, my 4.8.7 apps failed in so many levels. Something as simple as loading an image was completely broken. I did a little digging and it turns out since Qt 4.8.6, support for versions of Windows before version 10 was dropped. So instead of gambling with newer versions of Qt that just won’t work on my “old” development Windows machine, I have to count on the versions of Qt that will. And Qt 4.8.5 was the last functioning version that seemed to be supported by most Windows versions.

How To Read EXIF Orientation From JPEG in Qt 4.8.5

For many Qt lovers out there who might want to use third-party EXIF parsing library with their Qt apps, it may prove difficult unless you know what you’re doing. If you’re a hobbyist like me, man, it’s just tough. But there are free EXIF parsers out there, and it might take a little elbow grease to make it work with Qt. In my case, I put together a very simple and basic image viewer that I thought users might appreciate if it auto-rotated any images that contained EXIF metadata such as orientation. In smartphones and DSLRs, there is usually a sensor that records which orientation the picture was taken in. So when you view the photo without orientation applied, it might be a minor nuisance having to manually rotate it. That’s where you come in as software developer and take care of it for the end-user. Continue reading “How To Read EXIF Orientation From JPEG in Qt 4.8.5”

Fixing Windows 10 Aspect Ratio Scaling Problem For Lower Resolution Display

You may notice if you’re still deploying applications using resolutions less than 800x600x72dpi on Windows 10 that the autoscaling for the aspect ratio might be wonky. That’s because all these new fancy operating systems are trying to cater to ultra high resolution/density screens these days, and if you’re building an old-fashion 2D game engine that doesn’t require too much screen resolution, the final output might be thrown off a bit. Sometimes it’s just the graphics card, but in Windows 10 case, it seems it’s built into the operating system. Anyway, this is how I “fixed” it.

Example of incorrect aspect ratio in Windows 10 auto-scaling fullscreen
Example of incorrect aspect ratio in Windows 10 auto-scaling fullscreen

Continue reading “Fixing Windows 10 Aspect Ratio Scaling Problem For Lower Resolution Display”

Qt Real 3D Emulates SNES Mode 7 Prototype Demo

It’s actually a little more advanced than SNES Mode 7 because it’s real 3D. Yes, Nintendo’s Mode 7 was 3D, but the limitation was to the ground plane. I needed to have better understanding of how a 3D engine worked so that mapping of objects went smoothly. So where ever I place a 3D object into the world, is also where I can place a 3D “plane” that I can use a 2D texture as a 3D sprite. For example, say I wanted to put a tree or stop sign on the map for a racing game similar to F-Zero.

Qt 4.8.7 Prerequisites for Windows

Qt 4.8.7 differs greatly from Qt 4.8.5 in that they’ve wanted to provide more access to Windows 7 and later API. This makes the versions’ dependencies incompatible when you distribute your apps. So pay attention.

Downloads (For Distribution/Standalone Runtime):

Required

libgcc_s_dw2-1.dll 48 KB (UPX compressed)
libstdc++-6.dll 409 KB (UPX compressed)
libwinpthread-1.dll 25 KB (UPX compressed)
QtCore4.dll 1.1 MB (UPX compressed)
QtGui4.dll 4.1 MB (UPX compressed)

And for image format support:

/imageformats/ 2.3 MB (UPX compressed)

And for Phonon to work:

phonon4.dll 121 KB (UPX compressed)
QtXml4.dll 143 KB (UPX compressed)
QtDBus4.dll 182 KB (UPX compressed)
/phonon_backend/ 1.5 MB (UPX compressed)
/codecs/ 1.4 MB (UPX compressed)
qt487_dependencies_upx.zip – contains all minimum dependencies to run my Qt 4.8.7 apps NOTE: Not available yet, I’ll update this when I have working demo

Downloads (For Developing):

Qt 4.8.7 SDK qt-opensource-windows-x86-mingw482-4.8.7.exe (337MB)
minGW 64 + GCC 4.8.2 compiler i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z (46MB)
QtCreator 2.8.0 qt-creator-windows-opensource-2.8.0.exe (52MB) Note: there is newer version 2.8.1 but I don’t need it, so I cannot guarantee ver 2.8.1 will work or is compatible myself

IMPORTANT: If you can’t get Qt 4.8.7 to work for Windows, follow these instructions if you are upgrading from previous version, ie 4.8.5.