Архитектура Qt для встраиваемых Linux-систем
|
UNIX Domain Socket |
---|
The server communicates with the client applications over the UNIX domain socket. You can retrieve direct access to all the events a client receives from the server, by reimplementing QApplication's qwsEventFilter() function. |
The clients (and the server) communicate with each other using the QCopChannel class. QCOP is a many-to-many communication protocol for transferring messages on various channels. A channel is identified by a name, and anyone who wants to can listen to it. The QCOP protocol allows clients to communicate both within the same address space and between different processes.
The mouse driver (represented by an instance of the QWSMouseHandler class) is loaded by the server application when it starts running, using Qt's plugin system.
A mouse driver receives mouse events from the device and encapsulates each event with an instance of the QWSEvent class which it then passes to the server.
Qt for Embedded Linux provides ready-made drivers for several mouse protocols, see the pointer handling documentation for details. Custom mouse drivers can be implemented by subclassing the QWSMouseHandler class and creating a mouse driver plugin. The default implementation of the QMouseDriverFactory class will automatically detect the plugin, loading the driver into the server application at runtime.
In addition to the generic mouse handler, Qt for Embedded Linux provides a calibrated mouse handler. Use the QWSCalibratedMouseHandler class as the base class when the system device does not have a fixed mapping between device and screen coordinates and/or produces noisy events, e.g. a touchscreen.
See also: Qt for Embedded Linux Pointer Handling and How to Create Qt Plugins.
The keyboard driver (represented by an instance of the QWSKeyboardHandler class) is loaded by the server application when it starts running, using Qt's plugin system.
A keyboard driver receives keyboard events from the device and encapsulates each event with an instance of the QWSEvent class which it then passes to the server.
Qt for Embedded Linux provides ready-made drivers for several keyboard protocols, see the character input documentation for details. Custom keyboard drivers can be implemented by subclassing the QWSKeyboardHandler class and creating a keyboard driver plugin. The default implementation of the QKbdDriverFactory class will automatically detect the plugin, loading the driver into the server application at run-time.
See also: Qt for Embedded Linux Character Input and How to Create Qt Plugins.
The default behavior is for each client to render its widgets as well as its decorations into memory, while the server copies the memory content to the device's framebuffer.
Whenever a client receives an event that alters any of its widgets, the application updates the relevant parts of its memory buffer:
The decoration is loaded by the client application when it starts running (using Qt's plugin system), and can be customized by deriving from the QDecoration class and creating a decoration plugin. The default implementation of the QDecorationFactory class will automatically detect the plugin, loading the decoration into the application at runtime. Call the QApplication::qwsSetDecoration() function to actually apply the given decoration to an application.
Direct Painting |
---|
It is possible for the clients to manipulate and control the underlying hardware directly. There are two ways of achieving this: The first approach is to set the Qt::WA_PaintOnScreen window attribute for each widget, the other is to use the QDirectPainter class to reserve a region of the framebuffer. By setting the Qt::WA_PaintOnScreen attribute, the application renders the widget directly onto the screen and the affected region will not be modified by the screen driver unless another window with a higher focus requests (parts of) the same region. Note that if you want to render all of an application's widgets directly on screen, it might be easier to set the QT_ONSCREEN_PAINT environment variable. Using QDirectPainter, on the other hand, provides a complete control over the reserved region, i.e., the screen driver will never modify the given region. To draw on a region reserved by a QDirectPainter instance, the application must get hold of a pointer to the framebuffer. In general, a pointer to the framebuffer can be retrieved using the QDirectPainter::frameBuffer() function. But note that if the current screen has subscreens, you must query the screen driver instead to identify the correct subscreen. A pointer to the current screen driver can always be retrieved using the static QScreen::instance() function. Then use QScreen's subScreenIndexAt() and subScreens() functions to access the correct subscreen, and the subscreen's base() function to retrieve a pointer to the framebuffer. Note that Qt for Embedded Linux also provides the QWSEmbedWidget class, making it possible to embed the reserved region (i.e., the QDirectPainter object) in a regular widget. |
When a screen update is required, the server runs through all the top-level windows that intersect with the region that is about to be updated, and ensures that the associated clients have updated their memory buffer. Then the server uses the screen driver (represented by an instance of the QScreen class) to copy the content of the memory to the screen.
The screen driver is loaded by the server application when it starts running, using Qt's plugin system. Qt for Embedded Linux provides ready-made drivers for several screen protocols, see the display management documentation for details. Custom screen drivers can be implemented by subclassing the QScreen class and creating a screen driver plugin. The default implementation of the QScreenDriverFactory class will automatically detect the plugin, loading the driver into the server application at run-time.
To locate the relevant parts of memory, the driver is provided with the list of top-level windows that intersect with the given region. Associated with each of the top-level windows there is an instance of the QWSWindowSurface class representing the drawing area of the window. The driver uses these objects to retrieve pointers to the various memory blocks. Finally, the screen driver composes the surface images before copying the updated region to the framebuffer.
Accelerated Graphics |
---|
In Qt for Embedded Linux, painting is a pure software implementation, but (starting with Qt 4.2) it is possible to add an accelerated graphics driver to take advantage of available hardware resources. The clients render each window onto a corresponding window surface object using Qt's paint system, and then store the surface in memory. The screen driver accesses the memory and composes the surface images before it copies them to the screen as explained above. To add an accelerated graphics driver you must create a custom screen and implement a custom raster paint engine (Qt for Embedded Linux uses a raster-based paint engine to implement the painting operations). Then you must create a custom paint device that is aware of your paint engine, a custom window surface that knows about your paint device, and make your screen able to recognize your window surface. See the accelerated graphics driver documentation for details. |
See also: Qt for Embedded Linux Display Management and How to Create Qt Plugins.
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) | Торговые марки | Qt 4.5.3 |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |