MethylBlue
  1. Filelight
  2. Codeine
  3. Wocka
  4. Blog
  5. Detritus
  6. Home
RSS

Archive for the ‘Last.fm’ Category

Overriding Qt Classes

February 26th, 2008

We had a need to override the QSystemTrayIcon::showMessage() function on mac specifically across multiple projects. The trouble is ensuring that developers use the override function even if they don’t know about it. So:


namespace Moose
{
    class QSystemTrayIcon : public ::QSystemTrayIcon
    {
    public:
        void showMessage( const QString& title, const QString& text )
        {
            //code
        }
    };
}

#define QSystemTrayIcon Moose::QSystemTrayIcon

Name the file “QSystemTrayIcon” and save it in a directory like QtOverrides. Then add the following to your qmake project file:

CXX = $$CXX -IQtOverrides

Which forces our override directory to be earlier in the include path than the Qt includes.

This method scares me somewhat, due to the define, but I couldn’t see a neater way of doing it.

Now if a developer #includes <QSystemTrayIcon> they will be using our stealth reimplementation.

Of course this method isn’t virtual, but that shouldn’t be a problem, people don’t tend to use QWidgets in a way that requires polymorphism. Well that’s a lie, but most methods are safe, on final-type classes.

Respond »

Dockless Helper Apps on Leopard

February 15th, 2008

The Last.fm client has a number of helper apps. These helper apps don’t link to QtGui so would normally not get a dock icon. However, since Leopard everything seems to get a dock icon by default if you put in the Contents/MacOS directory of your bundle.

There are two solutions that we found for this problem.

  1. Bundlise the binary

    This is more packaging work and feels lame. You can cheat and prevent having to copy your shared libraries into the new bundle using symlinks, ie:

    $ path=helper.app/Contents/MacOS/ mkdir -p $path && cd $path
    $ ln -s ../../../helper .
    $ vim ../info.plist
    
  2. A symlink from resources

    cd your.app/Contents/Resources/
    ln -s ../MacOS/yourapp .
    

    Launching the symlink will run the application in the background without a dock icon.

Any other solutions? Please write them below.

Respond »