Friday, August 01, 2008



© 2005,2006 Houssem BDIOUI, in parts Mondrian Nuessle, et al.

This is free software, licensed under the GPL. Logo

This project is hosted by and its sourceforge pages may be reached through this link.


The QConsole class is a custom widget that implements a basic console, completely written in C++ and relying on Qt (both 3.x & 4.x). It implements several features and is intended to be inherited from in order to have a "real" console for a specific scripting language, shell, etc... The class relies as much as possible on the features offered by QTextEdit (from which it inherits) and this implied a very simple and light code.

QtclConsole inherits from QConsole and emulates a TCL shell in a Qt application. So basically, the user is able to execute any TCL built-in command and also any other user-defined commands created using the TCL C-API. These commands should represent all the features of a given application, so the user will be able to execute them using the GUI and also in the embedded TCL shell. This is very useful in the EDA (Electronic Design Automation) field where most of the tools are using TCL scripting and Qt as well.

The qtclconsole sample application shows how to embed the QtclConsole widget in a main window. It is composed of  the Tcl implementation (qtclconsole.h, qtconsole.cpp), some custom Tcl commands (commands.h and commands.cpp), the commands class manager (commandsManager.h and commandsManager.cpp) and the main.cpp file. 

QPyConsole inherits from QConsole and implements a Python shell in a Qt application, similar to QtclConsole. The qpyconsole sample application shows how to use the QPyConsole class in a qt application. For a real world application, one would of course extend the embedded Python interpreter with a complete API of the application that is to be made scriptable.

Some screenshots are available (TCL and Python).


File releases as well as subversion access is provided by sourceforge. The latest release is qconsole 2.0.


  • QConsole is a custom widget that can be easily integrated in any interface.
    It is able to execute any command (implementated in child classes) and then displays its result in blue or red whether it has failed or not. It also displays the stdout/stderr output produced by these commands with the same colorization schema.

  • QConsole supports multi-line commands. In fact, when an incomplete command (e.g., unclosed braces) is validated, the cursor is set at the beginning of a new line.

  • QConsole supports specifying a different prompt.

  • Navigation:

    • Left and right keys to move the cursor in the edition zone (from the prompt to the end of the paragraph plus all the extra lines in multi-line command mode).

      • Associated with the shift key, selection is then possible.

      • Associated with ctrl key, the cursor is moved between the words.

      • Ctrl and shift keys can be used together.

    • If not in multi-line mode, up and down keys permit the user to navigate in the commands' history as with advanced shells, otherwise they permit to navigate in the edition zone.

    • Home and end keys allow moving the cursor respectively just after the prompt and at the end of the current line.

      • Associated with the shift key, selection is then possible.

  • Edition:

    • Simple key strokes work as expected and the 'enter' will place the command into the history list, validate it and 'execute' it giving us back the result (this is in case the command is complete, otherwise the cursor will move to a new line).

    • Pressing Ctrl + C key sequence will cancel the current command and shows the prompt again.

    • Pressing the Tab key will try to autocomplete the current command. If there are many possibilities, they should be all shown.

    • The Delete and Backspace keys will delete selected text or simply one character in the limits of the edition zone. The ctrl key can be associated with them to delete whole words.

    • Copy & Paste are always enabled, but Cut is only possible in the edition zone.

  • Mouse usage:

    • If the cursor is not placed in the edition zone, its position is undone.

    • Selection using the mouse is possible everywhere.

QtclConsole specific features

  • Adding custom Tcl commands is eased through the singleton class commandsManager and its registerFunction() method. Besides, this class is responsible of holding the Tcl_Interp instance. Several examples showing its usage were implemented and can be tested in the console:

    • The help command shows all the custom TCL commands registered through the commandsManager class (as well as via the TclCallBack class).

    • The msgbox sample command was added in the commands.cpp file and implements the Qt QMessageBox::warning() static method.

    • The history command directly implemented in the QtclConsole class. It shows the history list of all validated commands.

    • The set_prompt command directly implemented in the QtclConsole class. It allows changing the prompt of the console.

    • The save_script command saves the last entered commands in a script file.

QpyConsole specific features

QpyQconsole adds the capability to use an embedded python interpreter in a C++ Qt application. The features of QConsole are all available including history, command completion (through the use of rlcompleter), etc.
Custom Python commands are available to communicate with the console widget:
  • clear- clears the console
  • reset - reset the interpreter and clear the console
  • save <filename> - save commands up to now in given file
  • load <filename> - load commands from given file
  • history - shows the history
  • quit- print information about quitting


Version 2.0 (releases March 23, 2006)

  • Supports Qt4.x:
    •   qt3support classes used since new QTextEdit/QTextCursor/QTextDocument classes are not flexible enough !
    •   Qt3.x still supported through usage of QT_VERSION macro
  • QConsole class:
    •  Pasting with middle mouse button possible even when clicking  outside of the edition zone
    •  New internal replaceCurrentCommand() method for better modularity
    •  When navigating in history, multi-line commands were not totally replaced
    •  Possibility to disable the stdout/stderr interception
    •  Possibility to choose the colors of the cmd, stdout, stderr and completion (as well as the font)
    •  a new loadScript() method (useful for scripting languages not providing this feature)
  • QTclconsole class:
    •   Use of tclnotify.* approach allowing interpreting asynchrnous tcl commands as in:
      after 1000 {puts hello}

      Thanks to Ulrich Ring
  • New Python implementation (QPyConsole - thanks to Mondrian Nuessle).
  • General code review

Version 1.1 (released November 30, 2005)

  • commandsManager class:
    • The getInstance() method can take an already created Tcl_Interp parameter
    • removed the registerCommand() method
    • New unregisterFunction()
    • New set of registerVariable() methods to register C++ vars as Tcl ones
    • Added support for "help messages" for functions and methods (accessible  through the new 'help' command)
  • QConsole:
    • Fixed a bug previously allowing inserting text outside of the edition zone: Bug that can happen when holding the mouse button pressed outside the edition zone and typing something
    • Possibility to select words outside of the edition zone using double clicks
    • Overridden paste() removed : handled by the previous bug fix
    • Disabled the popup menu
    • New public execCommand(QString) method that executes a Tcl command and dislpays back its result in the console
    • New saveScript() method that saves succeeded commands to a file
    • New completeCommand() method that gives suggestions to complete the current command
  • QtclConsole:
    • Redesigned into a singleton pattern
    • Implemented completeCommand() based on [ info commands ]
    • New Tcl saveScript command
  • New TclCallBack class that allows registring/unregistring  C++ methods as Tcl Callbacks:
    • Used for SetPrompt() and ShowHistory() in QtclConsole

Version 1.0 (released July 29. 2005)

  • Initial release version