To follow this tutorial you should have finished the previous chapter, Standalone Applications.
A application plugin is a DLL that is run from BPS workplace. There are more plugin types, for examle for group access, device interfaces or even SQL drivers. Basically those other plugin types follow the same basics as application plugins, but are out of scope of this tutorial.
Before we start lets create another feature file:
This feature copies a built dll file to the plugins\bpsapp
folder of the proper bps installation.
load(bpsinit.prf) DLLDESTDIR = $$bpsdir/plugins/bpsapp/
custom
) and run New Subproject… to start the New Subproject wizard.myhelloapp
C:\dev\mybps\custom
MyHelloApp
myhelloapp.h
myhelloapp.cpp
This creates the new subproject myhelloapp
with the qmake file myhelloapp.pro
and the source files myhelloapp.cpp
, myhelloapp.h
and myhelloapp_global.h
.
We dont need myhelloapp_global.h
because we write a plugin, not a typical library. So right-click on myhelloapp_global.h
and press Del, in the delete dialog check Delete file permanently and then Ok.
Instead we want another class and create it this way:
myhelloapp
) and run Add New… to start the New File wizard.MyHelloWindow
BpsApplicationWindow
myhellowindow.h
myhellowindow.cpp
C:\dev\mybps\custom\myhelloapp
Finally there is another special file needed for Qt 5 plugins:
myhelloapp
) and run Add New… to start the New File wizard.myhelloapp.json
C:\dev\mybps\custom\myhelloapp
Edit myhelloapp.pro
to:
TARGET = myhelloapp TEMPLATE = lib QT += widgets sql script CONFIG += plugin bpsgui bpsappplugin SOURCES += \ myhelloapp.cpp \ myhellowindow.cpp HEADERS += \ myhelloapp.h\ myhellowindow.h OTHER_FILES += \ myhelloapp.json
By adding plugin
to the CONFIG
variable Qt knows that a plugin shall be created. With bpsgui
the BPS API is included and finally bpsappplugin
tells to copy the created DLL into the right plugins folder of BPS.
In the JSON file some meta data can be defined for special Qt plugins, however BPS plugins don't need any and so we create just an empty JSON object.
Edit myhelloapp.json
to:
{}
(Thats right, just an opening and closing curly bracket.)
myhelloapp.h
:
#ifndef MYHELLOAPP_H #define MYHELLOAPP_H #include <bpsapplicationplugin.h> class MyHelloApp : public QObject, public BpsApplicationPlugin { Q_OBJECT Q_INTERFACES(BpsApplicationPlugin) Q_PLUGIN_METADATA(IID BpsApplicationPlugin_IID FILE "myhelloapp.json") public: MyHelloApp(); virtual bool init(BpsDatastore* aDatastore); virtual QString groupText() const; virtual QString text() const; virtual QString toolTip() const; virtual QIcon icon() const; virtual QWidget* createWidget(); private: BpsDatastore* mDatastore; }; #endif // MYHELLOAPP_H
myhelloapp.cpp
:
#include "myhelloapp.h" #include "myhellowindow.h" #include <bpsgui.h> MyHelloApp::MyHelloApp() { } // constructor bool MyHelloApp::init(BpsDatastore* aDatastore) { mDatastore = aDatastore; return true; } // init QString MyHelloApp::groupText() const { return tr("My Apps"); } // groupText QString MyHelloApp::text() const { return tr("My Hello App"); } // text QString MyHelloApp::toolTip() const { return tr("This is my first BPS application plugin"); } // toolTip QIcon MyHelloApp::icon() const { return bpsGui->icon(bStr("about")); } // icon QWidget* MyHelloApp::createWidget() { return new MyHelloWindow(mDatastore); } // createWidget
This sets up the required information for BPS to know how to integrate our app in the workplace application list, and how to create the window when requested.
The MyHelloWindow implements a similar window as our standalone application hello
, therefore also the source looks very familiar:
myhellowindow.h
:
#ifndef MYHELLOWINDOW_H #define MYHELLOWINDOW_H #include <bpsapplicationwindow.h> class BpsDatastore; class MyHelloWindow : public BpsApplicationWindow { Q_OBJECT public: MyHelloWindow( BpsDatastore* aDatastore, QWidget *aParent = 0, Qt::WindowFlags aFlags = 0); virtual void init(); virtual QSize sizeHint() const; private: BpsDatastore* mDatastore; }; #endif // MYHELLOWINDOW_H
myhellowindow.cpp
:
#include "myhellowindow.h" #include <bpsgui.h> #include <QLabel> MyHelloWindow::MyHelloWindow( BpsDatastore* aDatastore, QWidget *aParent, Qt::WindowFlags aFlags) : BpsApplicationWindow(aParent, aFlags) { mDatastore = aDatastore; setWindowTitle(tr("Hello BPS")); setWindowIcon(bpsGui->icon(bStr("about"))); QLabel* label = new QLabel; label->setPixmap(bpsGui->pixmap(bStr("gears_run"), 64)); label->setAlignment(Qt::AlignCenter); setCentralWidget(label); } // constructor void MyHelloWindow::init() { // Could do some initializations here } // init QSize MyHelloWindow::sizeHint() const { // Set the initial window size return QSize(500, 300); } // sizeHint
Press Ctrl+Shift+B to build all. Try to resolve possible issues by checking that you really followed all instructions exactly. Finally the DLL myhelloapp.dll
should be created in the plugins/bpsapp
directory of your BPS installation:
Now run BPS and test your app:
This concludes the jump start into BPS C++ development. Shure there is still much to learn, however learning general C++ and Qt is beyond this tutorial.
Now you should have a good starting point where you can derive your own component developments from.