Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

This script creates a button, with the text "Hello world!" inside a window. When you click this button a new information window will pop up, saying "Hello World!" and displaying a OK button.

Image Added
Image Modified

h5. # Create toplevel window set w [qwidget ]
No Formatpanel
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
title
Start
a
new
script
  • Click File > New > Text Editor

This will create a new empty text editor where the graphics window used to be.

...

panel

Let us go through the script in detail. First we need a toplevel window that will contain the button. Type in:

#
No Format
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
title
Create
a toplevel
window
set w [qwidget ]

A window in QTcl is an instance of a QWidget object, hence the command name. It may be followed by a list of flags. Although rarely used, the flags can be used to modify the widgets look and behaviourbehavior. The next statement tells QTcl to delete the widget from memory when it is closed:

No Format
borderColor#404040
bgColor#eeeeee#F0F0F0
borderWidth1
borderStyledashed
titleSet widget to be deleted from memory when closed
qsetattribute deleteonclose

If this attribute was not set, closing the widget would merely make it invisible while still residing in memory, though sometimes this is the desired behaviour. When the deleteonclose attribute is set redisplaying the widget requires the whole widget to be recreated.

No let`s give the window a title:

No Format
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
titleSet window title to "Hello"

qsetwindowtitle "Hello"

The qsetwindowtitle command sets the window title. While there may be several windows available, QTcl will simply apply the command to the most recently created widget, which in this case is the QWidget window. The most recently created widget is also the so-called current widget. It does not matter whether the widget is visible or not. This is in fact how most Qui Qt commands work.

Next we want to create a layout for our window. This can be done by using a layout manager:

No Format
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
titleCreate a layout

qvboxlayout {

}

The qvboxlayout command creates a layout manager for this the window. A layout manager is also known as a geometry manager. The task of the layout manager is to arrange the widgets in a particular order. For instance, the QVBoxLayout layout manager stacks widgets vertically in their order of creation. There are two other layout managers in QTcl , 1) :

  1. The QHBoxLayout, which is similar to QVBoxLayout except it arranges widgets horizontally

...

  1. The QGridLayout, which arranges widgets in a grid pattern.

...

Now we want to populate the layout with a widget, in this case a button.

No Format
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
titleCreate a push button

qpushbutton "Hello world!"

The command qpushbutton creates the conventional button found in user interfaces. There are several types of buttons available in QTcl; this particular type of button is called a QPushButton. The first argument . Right now this button only has one argument which is the button text, the second argument is . Thus we need a second argument to tell the button what to do when being clicked.

The second argument will be a Tcl list that serves as the callback function for this button. This simply means that the commands in the list will be evaluated when the button is pushed. Following is the command that will be executed:

No Format
borderColor#404040
bgColor#eeeeee#F0F0F0
borderWidth1
borderStyledashed
titleAdd an executing command to the button
qinformation Information "Hello world!"

This command displays a simple information dialog with an 'OK' button, as seen below.

So far we have created the window and the button in memory. No window is yet visible on the screen. To make the window visible we have to invoke the final qshow command.

No Format
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
titleAdd an executing command to the button

qshow $w

QTcl will then draw the most recently created widget, or current widget, on to the screen. In this case the current widget is the window, which is then displayed along with its contents.

When the button is eventually pushed, the callback command is executed and a message box is displayed:

Image Removed

When the window is closed, it is also deleted from the computers memory in accordance with the deleteonclose attribute. Furthermore, since the layout manager and the button are contained inside the window, they will be deleted as well. Without the deleteonclose attribute, closing the window would just make it invisible, until the program again invoked the qshow command on this windowYour script should now look something like this:

No Format
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
titleFinal script

# Create toplevel window
set w [qwidget ]

# Delete window from memory when closing
qsetattribute deleteonclose

qsetwindowtitle "Hello"

# Arrange contents vertically
qvboxlayout {
	# Create a button that show an information dialog when pushed
	qpushbutton "Hello world!" { qinformation Information "Hello world!" }
}

# Make window visible
qshow $w

Panel
borderColor#404040
bgColor#F0F0F0
borderWidth1
borderStyledashed
titleExecute the script
  • Execute the script by right clicking anywhere in the text editor window and selecting Execute

A window with a Hello world!-button should now appear, and when clicking this button an information window saying "Hello world!" with an OK button should appear.

While this script is short, it has illustrated several key features of QTcl programming. For example, all QTcl commands begin with the letter 'q'. This serves the purpose of setting QTcl commands apart from the built-in Tcl commands. Also, several commands are located inside the '{...}' delimited block that follows the qvboxlayout statement. This syntactical structure tells QTcl that all widgets enclosed in the '{...}' block should be treated according to the enclosing command, in this case qvboxlayout. Moreover, since the QVBoxLayout is owned by the toplevel window, all widgets created inside this layout manager are also made child widgets of this window.

...

bgColor#eeeeee
borderWidth1

...