-rw-r--r-- | examples/LICENSE | 4 | ||||
-rw-r--r-- | examples/README | 10 | ||||
-rw-r--r-- | examples/applet/simpleimpl.cpp | 17 | ||||
-rw-r--r-- | examples/applet/simpleimpl.h | 5 |
4 files changed, 33 insertions, 3 deletions
diff --git a/examples/LICENSE b/examples/LICENSE new file mode 100644 index 0000000..bb4d39f --- a/dev/null +++ b/examples/LICENSE @@ -0,0 +1,4 @@ +(C) 2003 Holger 'zecke' Freyther + +Examples are part of the Opie Examples series. The example +series may be used, distributed and modified without limitation. diff --git a/examples/README b/examples/README index 3003830..a84e8ee 100644 --- a/examples/README +++ b/examples/README @@ -1,28 +1,36 @@ Hi newbie, this directory contains a set of examples for various API you may want to use. The examples go from simple to harder and must be understand as an extension of the examples from Qt in your source package. Be sure to look there at first and at their excelent tutorials as well. Note: that some files are found in apps/Examples to really show how to include apps properly. Note: to integrate your apps into the build make clean-configs put your application into a sourcedir edit $OPIEDIR/packages make +Naming Conventions: + Most of the time we prefix member variables with m_. This allows + us to see if a variable in a function is a member + or on the stack. + Function naming we use setFooBar() but fooBar() to get the + value. So please skip the get you're used from Java. + Other than that please try to avoid #ifdef and #defines + use const but we do not have any coding style convetions. simple/ - Simple Widget with quit button simple-icon - Simple Widget with loading resources and playing simple sound simple-main - Simple QMainWindow usage with toolbar and actions main-tab - QMainWindow with central tab widget -simple-pim - QMainWindow + QListView + PIM +simple-pim - QMainWindow + QListView + PIM + QCOP big-pim - Usage of Opie PIM with BigScreen Extension Compile by setting your environment (QTDIR, QMAKESPEC, PATH, OPIEDIR ) qmake -o Makefile example.pro
\ No newline at end of file diff --git a/examples/applet/simpleimpl.cpp b/examples/applet/simpleimpl.cpp index 981e0ab..82fc6e5 100644 --- a/examples/applet/simpleimpl.cpp +++ b/examples/applet/simpleimpl.cpp @@ -1,149 +1,162 @@ #include <qlabel.h> #include <qpainter.h> #include <qmessagebox.h> #include <qpe/applnk.h> // for AppLnk #include <qpe/resource.h> // for Resource loading #include "simpleimpl.h" SimpleApplet::SimpleApplet(QWidget *parent) : QWidget( parent, "Simple 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("Tux"); /* * 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() ); } SimpleApplet::~SimpleApplet() { 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 SimpleApplet::mousePressEvent(QMouseEvent* ) { QMessageBox::information(this, tr("No action taken"), tr("<qt>This Plugin does not yet support anything usefule aye.</qt>"), QMessageBox::Ok ); } void SimpleApplet::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 */ SimpleAppletImpl::SimpleAppletImpl() { } /* needed cause until it is only pure virtual */ SimpleAppletImpl::~SimpleAppletImpl() { + /* + * 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* SimpleAppletImpl::applet( QWidget* parent ) { - /* ownership has the parent */ - return new SimpleApplet( parent ); + /* + * There are problems with ownership. So we add + * our ownlist and clear this; + */ + SimpleApplet* ap = new SimpleApplet( parent ); + m_applets.append( ap ); + + return ap; } /* * A small hint where the Applet Should be displayed */ int SimpleAppletImpl::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 SimpleAppletImpl::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( SimpleAppletImpl ) } diff --git a/examples/applet/simpleimpl.h b/examples/applet/simpleimpl.h index 8459c96..f58e2af 100644 --- a/examples/applet/simpleimpl.h +++ b/examples/applet/simpleimpl.h @@ -1,72 +1,77 @@ /* * You may use, modify and distribute without any limitation */ /** * Opie and Qtopia uses a component system called QCOM * which was first part of the Qt 3.0 API but was made * prviate during the betas. Opie and Qtopia still use it * and we're happy with it. * Every starts with the QUnknownInterface. It supports functions * for reference counting and the most important one * is for a query. Every QCOM interface got a global unique id ( GUID,UUID ) * query is used to see if a interface is supported by * a dynamic shared object ( dso / plugin ) * For tasks like loading Applications, InputMethods, Today, MenuButton, * Taskbar, Style, Email Client there are specefic Interfaces you * need to implement. The interfaces inherits from QUnknownInterface and * you'll need inherit from the interface. * As example we will use the Taskbar interface */ #ifndef SIMPLE_OPIE_EXAMPLE_APPLET_H #define SIMPLE_OPIE_EXAMPLE_APPLET_H /* * The taskbar applet interfaces wants us to implement position() and applet() * additionally we need to implement add(), release() and queryInterface for QUnknownInterface * luckiy there is a macro for the reference counting * We provide an Implementation of the interface. */ #include <qwidget.h> +#include <qlist.h> + #include <qpe/taskbarappletinterface.h> /* * Because we only draw an Icon in a fixed width and height * we declare and define SimpleApplet here and you could use QLabel * setPixmap or use QWidget and draw yourself. * You might also want to reimplement mouse*Event to use some simple actions */ class SimpleApplet : public QWidget { Q_OBJECT public: SimpleApplet(QWidget *parent); ~SimpleApplet(); private: void mousePressEvent( QMouseEvent* ); void paintEvent( QPaintEvent* ); QPixmap *m_pix; }; class SimpleAppletImpl : public TaskbarAppletInterface { public: SimpleAppletImpl(); virtual ~SimpleAppletImpl(); QRESULT queryInterface( const QUuid&, QUnknownInterface** ); QWidget *applet( QWidget* parent ); int position()const; /* * macro for reference countint * if reference drops to zero * delete this is called */ Q_REFCOUNT + +private: + QList<SimpleApplet> m_applets; }; #endif |