Graphical User Interface¶
Overview¶
Graphical User Interface (GUI) is the process of displaying the graphical
components of an application. In fw4spl, the fwGui
library provides abstract
tools to display components like windows, buttons, textfield, aso.
The software architecture provides a way of selecting different backends in order to manage the GUI components. As a result, the fwGuiQt
library has been created to display components created using the Qt soup. Presently, this
backend is the only one supported by the applications.
Backend¶
When creating an application, we need to specify which gui backend we want to use. To do so,
the chosen gui bundle must be activated and started in the profile.xml of the application. The
main gui bundle for any application is guiQt
. The gui
bundle must be activated regardless
of the chosen backend.
<activate id="gui" version="0-1" />
<activate id="guiQt" version="0-1" />
<!-- ... -->
<start id="guiQt" />
Warning : The gui backend bundle must be started before any other bundle in the profile.xml.
Configuration¶
Frames¶
The frame is the main component of a GUI. The main service used to represent a general frame is ::fwGui::IFrameSrv
. The service ::gui::frame::DefaultFrame
is the default implementation for the main application frame. Every backend must provide its own implementation of this service.
The DefaultFrame service is configurable with different parameters :
- Application name
- Application icon
- Minimum window size
- GUI elements (toolbar, menubar, aso.)
<service uid="mainFrame" type="::gui::frame::SDefaultFrame">
<gui>
<frame>
<name>Application name</name>
<icon>path_to_application_icon</icon>
<minSize width="800" height="600"/>
</frame>
<menuBar />
<toolBar >
<toolBitmapSize height= "32" width="32" />
</toolBar>
</gui>
<registry>
<menuBar sid="menuBar" start="yes" />
<toolBar sid="toolBar" start="yes" />
<view sid="view" start="yes" />
</registry>
</service>
Layouts¶
The layouts are used to organize the different parts of a GUI. The main service used to manage layouts is ::fwGui::IGuiContainerSrv
. The service ::gui::view::SDefaultView
is the default implementation. Every backend must provide its own implementation of this service.
Several types of layout can be used :
- Line layout
- Cardinal layout
- Tab layout
Every layout can be configured with a set of parameters (orientation, alignment, aso.).
<service uid="subView" type="::gui::view::SDefaultView">
<gui>
<layout type="::fwGui::LineLayoutManager" >
<orientation value="horizontal" />
<view caption="view1" />
<view caption="view2" />
</layout>
</gui>
<registry>
<view sid="subView1" start="yes" />
<view sid="subView2" start="yes" />
</registry>
</service>
Multi-threading¶
The fwGui
library has been designed to support multi-thread application. When a GUI component needs to be accessed, the function call must be encapsulated in a lambda declaration as shown in this example:
::fwServices::registry::ActiveWorkers::getDefaultWorker()->postTask<void>(
[&] {
//TODO Write function calls
}
).wait();
This encapsulation is required because all access to GUI components must be performed in the thread containing the GUI. It moves the function calls from the current thread, to the GUI thread.