Qt project linker error for unresolved external symbol WinMain

Have you even received the following error after adding Qt to your Visual Studio project? The fix is easy but not what you would expect.

MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ)

To fix it, Open Properties for the project then go to Linker -> System and change the SubSystem to Not Set from the drop down list. Make sure you do this for All Configurations.

That’s it. Back to work!

How to override QTextEdit shortcut key bindings

The only way to override the default shortcuts while the QTextEdit has focus is to intercept the QEvent::ShortcutOverride event. There are 2 ways to intercept this event: 1. write an event filter 2. subclass QTextEdit and then override the virtual event(QEvent* event) method. I prefer this 2nd method (pun intended) because anything that changes the functionality of a widget should probably be its own class.

Here is an example of how I block the QTextEdit from using all shortcuts that start with Ctrl being pressed:

bool CustomTextEdit::event(QEvent *event)
{
    if(event->type() == QEvent::ShortcutOverride)
    {
        QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
        if(keyEvent->modifiers().testFlag(Qt::ControlModifier) == true)
        {
            // allow override of all Ctrl+ shortcuts
            return false;
        }
    }

    // normal procedure
    return this->QTextEdit::event(event);
}

Now that the QEvent::ShortcutOverride event has been used to cancel the shortcut, a QAction can be used to capture the shortcut calling setShortcut with the QKeySequence you wish to use. For example:

this->m_ActionCustomUndo->setShortcut(QKeySequence("Ctrl+Z"));

You can also setup the action directly in Qt Designer like this:

PS3 Update Causes 8002F1F9 ERROR

This was originally posted here at this link but is certainly worth saying again.

If your PS3 does not connect to your controllers via wireless and you believe it is a problem with your controller, you may be very wrong. The Bluetooth/wireless module in the PS3 may have failed. The system is still 100% usable except if you update the system software when it asks you to the error 8002F1F9 will occur… forever

I just spent hours thinking the firmware I downloaded was corrupt, or the hard drive went bad, or the controller I was using was the problem. No, Nope, and Not that either. Now I have a PS3 that used to work just fine with the wired network and wired controllers sitting here like a brick in a never ending error loop.

Do NOT update the system software of your PS3 if the wireless controllers are not able to connect wirelessly.

VirtualBox VM install of Linux Ubunutu or Lubunutu 18

I started to install Lubuntu 18 (a variant of Ubunutu) but the window graphics became corrupted after I selected the language. This is a known bug that sometimes occurs and there are various suggestions to workaround the problem.  What worked for me?

  1. Press Ctrl+Alt+F1
  2. Press Ctrl+Alt+F7
  3. Press Ctrl+Alt+F1

The screen went to a black blinking cursor and then back to normal.

Good luck!

RED – how to match lines that don’t contain a character

Time for another Regular Expression of the Day! Let’s say you are looking for all of the lines that don’t have a special character (like an ‘_’ underscore). Here is it:

^[^_]+$

Start of line, followed by characters that are NOT underscore, followed by End of line

It’s a little confusing that the start of line indicator is a carrot so if you think of it instead as the NOT the end of line indicator it helps

Google Cloud SDK – Creating a Guestbook Application

Google left out a lot of steps in their tutorial on using the App Engine to access a Datastore. Not only that, but if you want to run Python 3.x and 2.x on the same machine there are some simple ways to handle it that Google never explains. Here is the run down:

1. download and install python 3.x from the python website. this will include the py.exe python launcher
2. download and install python 2,x because Google doesn’t support 3.x when this was written
3. download and install the google cloud SDK and don’t use their bundled python option
4. when you open the google sdk command prompt, enter this to use the correct python version: SET PY_PYTHON=2

That’s it for the setup portion. Now for the real problem! You cannot execute the dev_appserver.py ./ python script and have it open a http server as expected. It will run and say something like “update#setState idle”
Also, you will get get an error (ERR_CONNECTION_REFUSED) trying to connect to locahost:8080. You need to do the following instead:

1. as mentioned in the install instructions for google cloud python sdk, you must install the missing python components using gcloud commands from a temp directory somewhere on your computer. This usually works:
cd %TEMP%
2. now enter the gcloud command:
gcloud components install app-engine-python
and when that is done get the extras because it didn’t work for me without them:
gcloud components install app-engine-python-extras
3. now you can run the dev_appserver.py but you have to use the py.exe launcher to make sure the correct v2 python exe is used, so change directories to where your project is and enter this command:
py “C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin\dev_appserver.py” ./app.yaml
4. open a web browser and go to http://localhost:8080 to see the results

Using grep on Windows to recursively find a C++ class definition in a header

There are so many grep examples out there but if you want to use grep on Windows to find something recursively in just one file type it can get a bit tricky.  Here is the quick 2 step process:

  1. get grep. you can find it here http://gnuwin32.sourceforge.net/packages/grep.htm

  2. add path to grep into your PATH by opening the Windows start menu and typing “env” then selecting Edit environment variables
    Windows Environment Variables
  3. open a command prompt by opening the Windows start menu and typing “cmd” then press Enter
  4. enter a grep command.  for example, to find a class definition in all .h files it might be:
    grep -r --include=*.h "class WhereIsThatClass" *

How to maintain aspect ratio for QPixmap as a QWidget instead of QLabel

There are so many times that I have wanted an easy way to show a QPixmap on a form while maintaining the aspect-ratio of the image that I finally sat down and made one.  The single header file can be downloaded here: SpworksWidgetImage.zip. Extract the .h file and add it to any Qt project. It provides all of the necessary features to show an image when and where you want it using the SpworksWidgetImage class.

Usage:

//
// Don't forget to #include "spworkswidgetimage.h"
//

///////////
// SETUP //
///////////

SpworksWidgetImage* scaledImage = new SpworksWidgetImage();
scaledImage->SpworksWidgetImage_SetImagePath(":/anyImageResource.png");
this->layout()->addWidget(scaledImage);

///////////////////////
// OPTIONAL SETTINGS //
///////////////////////

// fill the widget to 75% of the widget's size
scaledImage->SpworksWidgetImage_SetScale(0.75);

// place the image in the bottom right corner of the widget
scaledImage->SpworksWidgetImage_SetAlignment(Qt::AlignRight | Qt::AlignBottom);

// paint the background of the entire widget white before painting the pixmap
scaledImage->SpworksWidgetImage_SetBackgroundColor(Qt::white);

// place a hidden border around the widget to keep the image off the edge
scaledImage->SpworksWidgetImage_SetBorderColor(QColor());
scaledImage->SpworksWidgetImage_SetBorderWidth(10);

//