This time, I used a QPainter object in a very ordinary way, as would be done in genuine GUI-building.

One project which I have been posting about has been, my ongoing effort to teach myself how to use the Qt5 GUI Library, which professional programmers do use in order to design Graphical User Interfaces – GUIs – for applications / programs. In fact, in a preceding posting, I wrote that I had discovered a deliberately unusual way to use one of the object classes in Qt 5.7.1, so that a ‘QImage’ object could be rendered to the screen of a computer, without first having to be transformed into a ‘QPixmap’ object. The ordinary thing to do would be, to transform it thus, first.

That trick can increase performance if two situations are met:

  • The graphical information could have started out as a bitmapped image, And
  • That image could have been unusually large, so that to have to buffer the entire image in its uncompressed form several times, could pose a considerable drain on the amount of memory that even modern computers should part with.

But, when designing GUIs, the starting point of the graphical information can be, simulated brush-strokes, with a simulated ‘QBrush’ and ‘QPen’, that are orchestrated by a programmer to give logical meaning to his GUI (beyond just adding the predefined widgets to it). In that case, the trick which I just wrote about will not gain anything over what I am about to describe.

When the ‘QPainter’ object and session are initialized, their target can be a ‘QPixmap’ object, and, after a sequence of painting instructions has finished, it can be assigned to a ‘QLabel’ widget once, by way of the ‘.setPixmap()’ function, thus resulting in a custom widget. Much buffering takes place, and, if the code has been written correctly, the graphic appears on the screen. The following is the graphic which my latest exercise generated:


Admittedly, this does not correspond to the GUI of any real software. But hypothetically, it just as well might. In fact, ‘A Chess-Board’ is just as easy to construct, using the same methodology. Only, actually programming the computer to play Chess is a little harder. ;-)

The fact that I was able to post this graphic was partially due, to the added ability the Qt5 Libraries have, to Save a ‘QPixmap’ object, or a ‘QImage’ object, directly to the hard drive, using a simple, straightforward API, and to the format of a PNG File. That task is also achieved in the code sample I am about to link to.

The real caveat here is, Not to try doing funny stuff with the internal ‘.pixmap()’ pointer that belongs to the ‘QLabel’ object, because even though it can be done, writing to that internal property does not offer much in the way of performance improvements, when the goal is to design most GUIs.

(This is a link to the previous exercise.)

(Updated 8/21/2020, 21h25… )

Continue reading This time, I used a QPainter object in a very ordinary way, as would be done in genuine GUI-building.

Lessening my Criticism of OpenShot

In this earlier posting, I criticized a non-linear video editor named “OpenShot”, stating that it was unstable. I think I need to both lessen, and pinpoint my criticism of this software.

At the time I was mainly having problems with the Windows version of OpenShot, which its developer worked long and hard to port to Windows. But the actual problem with OpenShot under Windows has to do with an environment variable named ‘QT_HOME’. When we install certain Linux-centric software under Windows, we are often instructed to set our ‘PATH’ variable to point to it. But with Qt-libraries, there is an additional variable named ‘QT_HOME’, which states what folders the Qt-libraries are to be found in. This is a global variable under Windows, even though we may have different examples of software installed, that use different versions of the Qt-libraries.

The way it is with me, I have ‘Kleopatra’ installed, which is also a Qt-based application which has been ported to Windows. Normally, a Windows executable will look in its own folder first, for an .DLL Files it needs, before looking in other directories.

But OpenShot is an application that comes with many Qt-library-files, located in its own directory or directories. And so to point the executable to these libraries, the OpenShot installer sets this environment variable.

The problem becomes, that when I next try to run Kleopatra, its Qt-executable respects this variable, and starts to try loading the Qt-libraries that shipped with OpenShot. Kleopatra does this, even though the developers of Qt have apparently forgotten that this variable exists because its observance is built-in to Qt.

The problem here is not strictly the fault of OpenShot developers. With Qt applications, the slightest mismatch between the Qt version the application was linked against, from the shared libraries it will ink to again, when it is run, will cause typical error messages. This problem has already happened to many users, who install Qt-based applications under Linux, that were not compiled and linked in-stream with the packaged version of Qt. In fact, when we install certain Qt-based applications that are out-of-tree in this way, we often need to do something like this:


rm -f libQt*.so*


In the folder of the software in question, to force that software to link to the Qt-libraries we have installed globally, instead of linking to its own version of these libraries, before the software will run.

So in my case, when the time came for Kleopatra to ask me for my passphrases, in order to unlock my private keys, this library-mismatch prevented the software from working. At first this might sound like some sort of malware-problem, but is really just a library-incompatibility-problem.

And so the only way I was able to clean up this problem on my Windows 7 machine ‘Mithral’, was to uninstall the Windows version of OpenShot, which its authors provided so carefully, and to delete this environment variable as well. Apparently, if this variable is set and the folder empty – or nonexistent – this is not enough to convince a Qt-application to link to its own Qt-libraries. In my case I needed to delete this variable as well, before Kleopatra became stable again.

Now, if a user only feels that he will be running software on his Windows computer, that uses one, global Qt-version, this could all look very different. But in my usage-scenario,

  • The way I set up my Windows machine is different, and
  • I have access to OpenShot on my Linux machines, for which reason I do not need this software under Windows.

I think that I had the additional problem on the machine I name ‘Phoenix’, that OpenShot once crashed my X-server, when instructed to play back a corrupted video file, in its preview window, but at full quality. Yet, I have already learned that ‘Phoenix’ has a weak, fragile instance of the X-server running… So this may also not strictly be the fault of OpenShot developers.



Interpreting various Kleopatra Errors

If we initially install “Kleopatra” under Windows, by way of ‘GPG4Win’, there could be many reasons fw the application may not work at first. But once it is installed, we usually expect it to continue working, especially if we also did not upgrade it.

But it has recently happened to me, that an attempt to launch the Kleopatra GUI failed, and gave me “Application Error 0xc0000005″. After that, uninstalling specific software, which did not insert any special libraries into the workings of Kleopatra, and then rebooting the Windows 7 machine, got rid of the error, and allowed Kleopatra to work again. In order to understand what this could mean, it is necessary to understand what Kleopatra normally does.

Kleopatra is a GUI, for the “GNU Privacy Guard” suite, which provides encryption, which manages public and private keys, and which manages the encryption of private keys as well. In order to do this, the application starts a process called ‘gpg-agent’, by means of which passwords can be entered securely, with which we are protecting our secret encryption keys. Securely means, in such a way that no other applications can read or log these passwords.

The error message above is somewhat vague. It can mean that a corrupted registry key has been digested by Windows, or it can also mean that some application is trying to access protected memory that does not belong to it. One possible meaning it could have in the case of Kleopatra, is that this application was unable to establish a secure way for key-strokes to be received by ‘gpg-agent’.

The fact that a reboot was required, after the other software was uninstalled, before Kleopatra would work again, could also mean several things:

  1. The other application could have installed a library to our Windows System, which remained loaded, even though the DLL File was already deleted. Specifically, this could be a Linux application using the Qt GUI libraries, that was ported to Windows, but that also set its version of the Qt libraries as the system-wide default, which might not be compatible with the Qt libraries that Kleopatra uses, and which the latter defines properly, in a way staying local to it.
  2. Windows could have digested a corrupted Registry entry during the previous reboot, in a way that would affect the entire session, even after this Registry entry was removed from the version stored on the HD.
  3. The other application could have left some process running in the BG, which could have affected how key-strokes are entered, even though we weren’t using that other application.


There is a more specific term for Case 3 above: We call that a key-logger. And it comes in a fitting context, that a program we use to manage our secret encryption keys, would announce to us that something was wrong.

In this case I would ask myself, whether I have actually typed in any passwords since the preceding reboot, including the password that unlocks the session. I assume that the first time we start a Windows session, this key-logger would not get the password to the machine, because processes have not yet launched, which do so after we start the first session. But if the screensaver came on, and if we entered our password to unlock that, then the BG processes would presumably be running already, and would be able to log that password.

And so aside from getting rid of such a potential threat, we also need to ask ourselves whether some immediate effort needs to be made, to change sensitive passwords…

In my own case I also observed, that the simpler GUI named ‘GPA’, which does not use Qt as its GUI library, and which also installs with ‘GPG4Win’, was still working 100%, and that the ‘gpg-agent’ process was successfully launched and running. A more critical error would have stemmed from ‘gpg-agent’ instead of from attempting to launch the GUIs.

Another observation which applies to my scenario is, that After I Uninstalled the other application and rebooted, the Error Went Away. I did not use a System Restore Point. If somebody was to install a key-logger intentionally, then he would also configure his uninstall script in such a way, as to leave that key-logger installed, if we simply gave the command to uninstall the application, which would in this case be the Trojan.


(Edit : ) It is worth pointing out, that Kleopatra is an application, where the EXE File is not installed in the same folder, as the DLL Files it will link to. But it is normal Windows behavior, first to look in the folder of the EXE to try finding the DLLs there. Only after those are not found there, does Windows ‘look for them elsewhere’.

This could explain why Kleopatra was one of the fewer programs on my machine, that were malfunctioning, which the majority of the programs were not.

It should also be pointed out, that the other application which was causing this malfunction in my scenario, had its libraries distributed in numerous folders local to it. Therefore, it would have made sense on some level, for its developer to enter those folders into the path, in which his EXE Files were supposed to search for them.

The result could easily have been, that the DLLs which belong to Kleopatra, and which Kleopatra would thus try to link to, matched the exact names of DLL Files in the other programmer’s folders by chance, to which Kleopatra could have linked falsely.

But this may not always be everybody’s scenario. Some people report getting this error message sporadically, and without the success of having gotten rid of. And then, what could it mean?