Posts Tagged 'Qt'

Migrating Qt Apps from Windows to Mac OS X

One of the great selling points of Qt is that you can write one application and compile it natively on Windows, Linux or Max OS X.  I’ve been doing most of my dev work on a Windows XP laptop, however I also have a MacBook that I have for personal use.  I decided to see whether it was really that easy to take code that works well on windows and drop in into an xcode project and have it compile successfully.

Continue reading ‘Migrating Qt Apps from Windows to Mac OS X’

Displaying numbers with qDebug

Following up on my last post about using qDebug to write logging information to a file, I’ve noticed that there is some confusion about how to best use qDebug.  qDebug is limited – it expects a QByteArray (or similar) because it is converting that directly into a char * string for output (about as simple as you can get).  However, most people want to write more information than just a simple byte array to the output stream.  Below are some examples:

//Basic qDebug call
qDebug("My debug text");
//Basic Output using QString
QString text = "My debug text";
qDebug(text.toAscii());
//Debug string with number
int times = 5;
qDebug("Loop was run "+QString::number(times).toAscii()+" times");

To output a number, the easiest way is to use QString’s static method ‘number’ to create a new QString and then output the QByteArray to qDebug.

Notes/Tasks Version 0.8 Released

I’ve released the latest version of Notes/Tasks, version 0.8, my Qt application for note and task management.  Notes/Tasks provides a powerful and simple tool for note and task management.

In this latest release, I’ve added the ability to synchronize your notes and tasks with notestasks.com – you can access your notes from anywhere.  There is also a special mobile interface for iPhones!  Also new is AES encryption for you data, adding security for sensitive information.

Check it out and let me know what you think!

C++ Crypto Libraries

As part of a project, I’ve been looking around for a simple to use C++ crypto  library that supports hashing and at least AES 128 encryption.  My requirements were pretty simple: I needed a library with a good API that I could use to encrypt the contents of a data file using a password.  I needed something that was standard and could be integrated in with Qt without a whole lot of effort, and I didn’t want something that would bloat my app with a lot of encryption mechanisms I don’t need.  I found three major libraries, however one was for MSVC and cost money, neither of which I have.  The other two, Crypto++ and Botan are free (as in beer) and I tried both.  Read on for my reviews.

Continue reading ‘C++ Crypto Libraries’

Writing Qt Debug Information to a File

Update: I’ve added some additional information on limiting logging when compiling in release mode.

Common problem: I’ve got a Qt app with debugging information, and have a bug that only appears when the code is compiled using the release makefile.

I’ve had this a happen a few times.  By default, the debugging information is written to the debugger console, but when running a compiled ‘release’ app, there is no debugging console and thus no way to get the output.

Solution: Turn on debugging messages in the release makefile and have Qt write the messages to a log file.

Step 1: Remove the -DQT_NO_DEBUG flag from your release makefile.  This will increase the size of the app, though by how much depends on the amount of debugging code in your app.

Step 2: Create a debug message handler function in your main.cpp file.  Here’s an example:

#include <iostream>
#include <fstream> 

#include ...

using namespace std;

ofstream logfile;

void MyOutputHandler(QtMsgType type, const char *msg) {
    switch (type) {
        case QtDebugMsg:
            logfile << QTime::currentTime().toString().toAscii().data() << " Debug: " << msg << "\n";
            break;
        case QtCriticalMsg:
            logfile << QTime::currentTime().toString().toAscii().data() << " Critical: " << msg << "\n";
            break;
        case QtWarningMsg:
            logfile << QTime::currentTime().toString().toAscii().data() << " Warning: " << msg << "\n";
            break;
        case QtFatalMsg:
            logfile << QTime::currentTime().toString().toAscii().data() <<  " Fatal: " << msg << "\n";
            abort();
    }
}

Step 2: Install the handler in your main function, like so:

int main(int argc, char *argv[])
{
    logfile.open("logfile.txt", ios::app);
    #ifndef QT_NO_DEBUG_OUTPUT
    qInstallMsgHandler(MyOutputHandler);
    #endif
    ...
}

Now all debug information will be written with the time to a log file called ‘logfile.txt’ in your application directory.

When compiling your final application, be sure to add the flags -DQT_NO_DEBUG and -DQT_NO_DEBUG_OUTPUT.  These will reduce the application size and ensure that the logfile isn’t used.  Alternately, you can keep NO_DEBUG_OUTPUT out of the makefile if you still want the logfile.