1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#include <qlabel.h>
#include <qpainter.h>
#include <qmessagebox.h>
#include <qpe/applnk.h> // for AppLnk
#include <qpe/resource.h> // for Resource loading
#include "%{APPNAMELC}.h"
%{APPNAME}::%{APPNAME}(QWidget *parent)
: QWidget( parent, "%{APPNAME} Applet" ) {
/*
* we will load an Image, scale it for the right usage
* remember your applet might be used by different
* resolutions.
* Then we will convert the image back to an Pixmap
* and draw this Pimxap. We need to use Image because its
* the only class that allows scaling.
*/
QImage image = Resource::loadImage("%{APPNAMELC}/%{APPNAMELC}");
/*
* smooth scale to AppLnk smallIconSize for applest
* smallIconSize gets adjusted to the resolution
* so on some displays like SIMpad and a C-750 the smallIconSize
* is greater than on a iPAQ h3870
*/
image = image.smoothScale(AppLnk::smallIconSize(), AppLnk::smallIconSize() );
/*
* now we need to convert the Image to a Pixmap cause these
* can be drawn more easily
*/
m_pix = new QPixmap();
m_pix->convertFromImage( image );
/*
* Now we will say that we don't want to be bigger than our
* Pixmap
*/
setFixedHeight(AppLnk::smallIconSize() );
setFixedWidth( AppLnk::smallIconSize() );
}
%{APPNAME}::~%{APPNAME}() {
delete m_pix;
}
/*
* here you would normal show or do something
* useful. If you want to show a widget at the top left
* of your icon you need to map your rect().topLeft() to
* global with mapToGlobal(). Then you might also need to
* move the widgets so it is visible
*/
void %{APPNAME}::mousePressEvent(QMouseEvent* ) {
QMessageBox::information(this, tr("No action taken"),
tr("<qt>This Plugin does not yet support anything usefule aye.</qt>"),
QMessageBox::Ok );
}
void %{APPNAME}::paintEvent( QPaintEvent* ) {
QPainter p(this);
/* simpy draw the pixmap from the start of this widget */
p.drawPixmap(0, 0, *m_pix );
}
/*
* Here comes the implementation of the interface
*/
%{APPNAME}Impl::%{APPNAME}Impl() {
}
/* needed cause until it is only pure virtual */
%{APPNAME}Impl::~%{APPNAME}Impl() {
/*
* we will delete our applets as well
* setAUtoDelete makes the QList free
* the objects behind the pointers
*/
m_applets.setAutoDelete( true );
m_applets.clear();
}
/*
* For the taskbar interface return a Widget
*/
QWidget* %{APPNAME}Impl::applet( QWidget* parent ) {
/*
* There are problems with ownership. So we add
* our ownlist and clear this;
*/
%{APPNAME}* ap = new %{APPNAME}( parent );
m_applets.append( ap );
return ap;
}
/*
* A small hint where the Applet Should be displayed
*/
int %{APPNAME}Impl::position()const {
return 1;
}
/*
* Now the important QUnkownInterface method without
* this one your applet won't load
* @param uuid The uuid of the interface
* @param iface The pointer to the interface ptr
*/
QRESULT %{APPNAME}Impl::queryInterface( const QUuid& uuid, QUnknownInterface** iface) {
/* set the pointer to the interface to 0 */
*iface = 0;
/*
* we check if we support the requested interface
* and then assign to the pointer.
* You may alos create another interface here so
* *iface = this is only in this simple case true you
* could also support more interfaces.
* But this example below is the most common use.
* Now the caller knows that the Interface Pointer
* is valid and the interface supported
*/
if ( uuid == IID_QUnknown )
*iface = this;
else if ( uuid == IID_TaskbarApplet )
*iface = this;
else
return QS_FALSE;
if ( *iface )
(*iface)->addRef();
return QS_OK;
}
/*
* Finally we need to export the Interface.
* CREATE_INSTANCE creates a interface and calls
* queryInterface for the QUnknownInterface once
* With out this function the applet can't be loaded.
*
* NOTE: If your applet does not load it's likely you've an
* unresolved symbol. Change the .pro TEMPLATE = lib to TEMPLATE= app
* and recompile. If the linker only complains about a missing
* main method the problem is more complex. In most cases it'll say
* you which symbols are missing and you can implement them.
* The main(int argc, char* argv[] ) does not need to be
* included in a library so it's ok that the linker complains
*/
Q_EXPORT_INTERFACE() {
Q_CREATE_INSTANCE( %{APPNAME}Impl )
}
|