diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d01cb85 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Miroslav Bendík diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..a2f8330 --- /dev/null +++ b/COPYING @@ -0,0 +1,27 @@ +Copyright (c) 2014, Miroslav Bendík and various contributors (see AUTHORS) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. + diff --git a/examples/examples.pro b/examples/examples.pro new file mode 100644 index 0000000..8ebb5f8 --- /dev/null +++ b/examples/examples.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS = \ + keyboardview \ + textedit \ diff --git a/examples/keyboardview/keyboardview.pro b/examples/keyboardview/keyboardview.pro new file mode 100644 index 0000000..eebbaf1 --- /dev/null +++ b/examples/keyboardview/keyboardview.pro @@ -0,0 +1,6 @@ +TEMPLATE = app +QT += gui quick +include($$PWD/../../src/components.pri) +SOURCES += \ + main.cpp +RESOURCES = resources.qrc diff --git a/examples/keyboardview/main.cpp b/examples/keyboardview/main.cpp new file mode 100644 index 0000000..cae7262 --- /dev/null +++ b/examples/keyboardview/main.cpp @@ -0,0 +1,25 @@ +#include +#include +#include +#include "../../src/KeyboardItem.h" +#include "../../src/ModeItem.h" +#include "../../src/ButtonItem.h" +#include "../../src/LayoutItem.h" + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + qmlRegisterType("QuickKeyboard", 1, 0, "Keyboard"); + qmlRegisterType("QuickKeyboard", 1, 0, "Mode"); + qmlRegisterType("QuickKeyboard", 1, 0, "Button"); + qmlRegisterType(); + qmlRegisterType("QuickKeyboard", 1, 0, "Layout"); + + QQuickView view; + view.setResizeMode(QQuickView::SizeRootObjectToView); + view.setSource(QUrl("qrc:/keyboard.qml")); + view.show(); + + return app.exec(); +} diff --git a/examples/keyboardview/resources.qrc b/examples/keyboardview/resources.qrc new file mode 100644 index 0000000..77c1c47 --- /dev/null +++ b/examples/keyboardview/resources.qrc @@ -0,0 +1,6 @@ + + + ../../qml/keyboard.qml + ../../qml/Btn.qml + + diff --git a/examples/textedit/example.qml b/examples/textedit/example.qml new file mode 100644 index 0000000..4668d38 --- /dev/null +++ b/examples/textedit/example.qml @@ -0,0 +1,17 @@ +import QtQuick 2.0 + +Rectangle { + width: 800; height: 600 + color: "white" + + Rectangle { + anchors.fill: input + color: "#eee" + border { width: 1; color: "gray" } + } + + TextEdit { + id: input + anchors { top: parent.top; left: parent.left; right: parent.right; margins: 10 } + } +} diff --git a/examples/textedit/main.cpp b/examples/textedit/main.cpp new file mode 100644 index 0000000..645d49d --- /dev/null +++ b/examples/textedit/main.cpp @@ -0,0 +1,13 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + app.addLibraryPath(app.applicationDirPath() + "/../../"); + QQuickView view; + view.setSource(QUrl("qrc:/example.qml")); + view.show(); + return app.exec(); +} diff --git a/examples/textedit/resources.qrc b/examples/textedit/resources.qrc new file mode 100644 index 0000000..071a722 --- /dev/null +++ b/examples/textedit/resources.qrc @@ -0,0 +1,5 @@ + + + example.qml + + diff --git a/examples/textedit/textedit.pro b/examples/textedit/textedit.pro new file mode 100644 index 0000000..34fae40 --- /dev/null +++ b/examples/textedit/textedit.pro @@ -0,0 +1,5 @@ +TEMPLATE = app +QT += gui quick +SOURCES = \ + main.cpp +RESOURCES = resources.qrc diff --git a/qml/Btn.qml b/qml/Btn.qml new file mode 100644 index 0000000..a6af5c0 --- /dev/null +++ b/qml/Btn.qml @@ -0,0 +1,17 @@ +import QtQuick 2.0 +import QuickKeyboard 1.0 + +Button { + property int row + property int col + Layout.row: row + Layout.col: col + Layout.colSpan: 2 + Layout.rowSpan: 2 + width: 50 + height: 50 + Rectangle { + color: "green" + anchors.fill: parent + } +} diff --git a/qml/keyboard.qml b/qml/keyboard.qml new file mode 100644 index 0000000..5c29442 --- /dev/null +++ b/qml/keyboard.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 +import QuickKeyboard 1.0 + +Keyboard { + width: 200; height: 100 + Mode { + id: standard + anchors.fill: parent + Btn{ col: 0; row: 0; label: "A"; symbols: ["A"] } + Btn{ col: 3; row: 3; label: "B"; symbols: ["B"] } + Btn{ col: 5; row: 5; label: "C"; symbols: ["C"] } + } + mode: standard +} diff --git a/quickkeyboard.pro b/quickkeyboard.pro new file mode 100644 index 0000000..2de6b27 --- /dev/null +++ b/quickkeyboard.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS = \ + examples \ + src diff --git a/src/BaseLayoutItem.cpp b/src/BaseLayoutItem.cpp new file mode 100644 index 0000000..4ce73df --- /dev/null +++ b/src/BaseLayoutItem.cpp @@ -0,0 +1,27 @@ +#include "ButtonItem.h" +#include "BaseLayoutItem.h" + +BaseLayoutItem::BaseLayoutItem(QQuickItem *parent): + QQuickItem(parent) +{ +} + +BaseLayoutItem::~BaseLayoutItem() +{ +} + +void BaseLayoutItem::addButton(ButtonItem *button) +{ + m_buttons.append(button); +} + +void BaseLayoutItem::clearButtons() +{ + m_buttons.clear(); +} + +const QList &BaseLayoutItem::buttons() const +{ + return m_buttons; +} + diff --git a/src/BaseLayoutItem.h b/src/BaseLayoutItem.h new file mode 100644 index 0000000..6e65c7c --- /dev/null +++ b/src/BaseLayoutItem.h @@ -0,0 +1,26 @@ +#ifndef BASELAYOUTITEM_H_ZHXO0UI7 +#define BASELAYOUTITEM_H_ZHXO0UI7 + +#include +#include +class ButtonItem; + +class BaseLayoutItem: public QQuickItem +{ +Q_OBJECT +public: + explicit BaseLayoutItem(QQuickItem *parent = 0); + ~BaseLayoutItem(); + + virtual void addButton(ButtonItem *button); + virtual void clearButtons(); + +protected: + const QList &buttons() const; + +private: + QList m_buttons; +}; /* ----- end of class BaseLayoutItem ----- */ + +#endif /* end of include guard: BASELAYOUTITEM_H_ZHXO0UI7 */ + diff --git a/src/ButtonItem.cpp b/src/ButtonItem.cpp new file mode 100644 index 0000000..231a6c4 --- /dev/null +++ b/src/ButtonItem.cpp @@ -0,0 +1,17 @@ +#include "ButtonItem.h" + +ButtonItem::ButtonItem(QQuickItem *parent): + QQuickItem(parent), + m_pressed(false), + m_modifier(false), + m_col(0), + m_row(0), + m_colSpan(1), + m_rowSpan(1) +{ +} + +ButtonItem::~ButtonItem() +{ +} + diff --git a/src/ButtonItem.h b/src/ButtonItem.h new file mode 100644 index 0000000..ee7dfab --- /dev/null +++ b/src/ButtonItem.h @@ -0,0 +1,47 @@ +#ifndef BUTTONITEM_H_VNF1QLCU +#define BUTTONITEM_H_VNF1QLCU + +#include +#include + +class ButtonItem: public QQuickItem +{ +Q_OBJECT +Q_PROPERTY(bool pressed MEMBER m_pressed NOTIFY pressedChanged DESIGNABLE false) +Q_PROPERTY(bool modifier MEMBER m_modifier NOTIFY modifierChanged DESIGNABLE false) +Q_PROPERTY(QString label MEMBER m_label NOTIFY labelChanged) +Q_PROPERTY(QStringList symbols MEMBER m_symbols NOTIFY symbolsChanged) + +// position +Q_PROPERTY(int col MEMBER m_col NOTIFY colChanged) +Q_PROPERTY(int row MEMBER m_row NOTIFY rowChanged) +Q_PROPERTY(int colSpan MEMBER m_colSpan NOTIFY colSpanChanged) +Q_PROPERTY(int rowSpan MEMBER m_rowSpan NOTIFY rowSpanChanged) +public: + explicit ButtonItem(QQuickItem *parent = 0); + ~ButtonItem(); + +signals: + void pressedChanged(bool is_pressed); + void modifierChanged(bool is_modifier); + void labelChanged(const QString &label); + void symbolsChanged(const QStringList &symbols); + + void colChanged(int col); + void rowChanged(int row); + void colSpanChanged(int colSpan); + void rowSpanChanged(int rowSpan); + +private: + bool m_pressed; + bool m_modifier; + QString m_label; + QStringList m_symbols; + int m_col; + int m_row; + int m_colSpan; + int m_rowSpan; +}; /* ----- end of class ButtonItem ----- */ + +#endif /* end of include guard: BUTTONITEM_H_VNF1QLCU */ + diff --git a/src/KeyboardItem.cpp b/src/KeyboardItem.cpp new file mode 100644 index 0000000..ef2b31e --- /dev/null +++ b/src/KeyboardItem.cpp @@ -0,0 +1,22 @@ +#include "KeyboardItem.h" + +KeyboardItem::KeyboardItem(QQuickItem *parent): + QQuickItem(parent), + m_mode(0) +{ +} + +KeyboardItem::~KeyboardItem() +{ +} + +void KeyboardItem::setMode(ModeItem *mode) +{ + if (m_mode == mode) { + return; + } + + m_mode = mode; + emit modeChanged(m_mode); +} + diff --git a/src/KeyboardItem.h b/src/KeyboardItem.h new file mode 100644 index 0000000..792ab1d --- /dev/null +++ b/src/KeyboardItem.h @@ -0,0 +1,26 @@ +#ifndef KEYBOARDITEM_H_PT4SCIAV +#define KEYBOARDITEM_H_PT4SCIAV + +#include +#include +#include "ModeItem.h" + +class KeyboardItem: public QQuickItem +{ +Q_OBJECT +Q_PROPERTY(ModeItem* mode MEMBER m_mode WRITE setMode NOTIFY modeChanged DESIGNABLE false) +public: + explicit KeyboardItem(QQuickItem *parent = 0); + ~KeyboardItem(); + + void setMode(ModeItem *mode); + +signals: + void modeChanged(ModeItem *mode); + +private: + ModeItem *m_mode; +}; /* ----- end of class KeyboardItem ----- */ + +#endif /* end of include guard: KEYBOARDITEM_H_PT4SCIAV */ + diff --git a/src/LayoutItem.cpp b/src/LayoutItem.cpp new file mode 100644 index 0000000..2741967 --- /dev/null +++ b/src/LayoutItem.cpp @@ -0,0 +1,158 @@ +#include +#include "ButtonItem.h" +#include "LayoutItem.h" + +LayoutItemAttached::LayoutItemAttached(QObject *parent): + QObject(parent), + m_col(0), + m_row(0), + m_colSpan(1), + m_rowSpan(1) +{ +} + +LayoutItemAttached::~LayoutItemAttached() +{ +} + +LayoutItem::LayoutItem(QQuickItem *parent): + BaseLayoutItem(parent), + m_rows(0), + m_cols(0) +{ + setFlag(QQuickItem::ItemHasContents); + setAcceptedMouseButtons(Qt::LeftButton); +} + +LayoutItem::~LayoutItem() +{ +} + +void LayoutItem::addButton(ButtonItem *button) +{ + BaseLayoutItem::addButton(button); + setRows(qMax(m_rows, layoutProperty(button, "row", 0) + layoutProperty(button, "rowSpan", 1))); + setCols(qMax(m_cols, layoutProperty(button, "col", 0) + layoutProperty(button, "colSpan", 1))); + + QObject *layoutAttached = qmlAttachedPropertiesObject(button); + if (layoutAttached) { + connect(layoutAttached, SIGNAL(colChanged(int)), SLOT(recalculateRowColSize())); + connect(layoutAttached, SIGNAL(rowChanged(int)), SLOT(recalculateRowColSize())); + connect(layoutAttached, SIGNAL(colSpanChanged(int)), SLOT(recalculateRowColSize())); + connect(layoutAttached, SIGNAL(rowSpanChanged(int)), SLOT(recalculateRowColSize())); + } +} + +void LayoutItem::clearButtons() +{ + foreach (const ButtonItem *button, buttons()) { + QObject *layoutAttached = qmlAttachedPropertiesObject(button); + if (layoutAttached) { + disconnect(layoutAttached, SIGNAL(colChanged(int)), this, SLOT(recalculateRowColSize())); + disconnect(layoutAttached, SIGNAL(rowChanged(int)), this, SLOT(recalculateRowColSize())); + disconnect(layoutAttached, SIGNAL(colSpanChanged(int)), this, SLOT(recalculateRowColSize())); + disconnect(layoutAttached, SIGNAL(rowSpanChanged(int)), this, SLOT(recalculateRowColSize())); + } + } + BaseLayoutItem::clearButtons(); + setRows(0); + setCols(0); +} + +LayoutItemAttached *LayoutItem::qmlAttachedProperties(QObject *object) +{ + return new LayoutItemAttached(object); +} + +void LayoutItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + BaseLayoutItem::geometryChanged(newGeometry, oldGeometry); + recalculatePositions(); +} + +void LayoutItem::mouseMoveEvent(QMouseEvent *event) +{ + QQuickItem::mouseMoveEvent(event); +} + +void LayoutItem::mousePressEvent(QMouseEvent *event) +{ + event->accept(); +} + +void LayoutItem::mouseReleaseEvent(QMouseEvent *event) +{ + event->accept(); +} + +void LayoutItem::setCols(int cols) +{ + if (m_cols == cols) { + return; + } + + m_cols = cols; + recalculatePositions(); +} + +void LayoutItem::setRows(int rows) +{ + if (m_rows == rows) { + return; + } + + m_rows = rows; + recalculatePositions(); +} + +int LayoutItem::layoutProperty(const ButtonItem *button, const char *property, int fallback) +{ + QObject *layoutAttached = qmlAttachedPropertiesObject(button); + if (!layoutAttached) { + return fallback; + } + return layoutAttached->property(property).toInt(); +} + +void LayoutItem::recalculateRowColSize() +{ + int rows = 0; + int cols = 0; + foreach (const ButtonItem *button, buttons()) { + rows = qMax(layoutProperty(button, "row", 0) + layoutProperty(button, "rowSpan", 1), rows); + cols = qMax(layoutProperty(button, "col", 0) + layoutProperty(button, "colSpan", 1), cols); + } + setRows(rows); + setCols(cols); +} + +void LayoutItem::recalculatePositions() +{ + if (m_rows == 0 || m_cols == 0) { + return; + } + + int w = width(); + int h = height(); + + foreach (ButtonItem *button, buttons()) { + QObject *layoutAttached = qmlAttachedPropertiesObject(button); + if (!layoutAttached) { + continue; + } + + int left = layoutAttached->property("col").toInt(); + int top = layoutAttached->property("row").toInt(); + int right = layoutAttached->property("colSpan").toInt() + left; + int bottom = layoutAttached->property("rowSpan").toInt() + top; + + int x = left * w / m_cols; + int y = top * h / m_rows; + + button->setProperty("x", x); + button->setProperty("y", y); + button->setProperty("width", right * w / m_cols - x); + button->setProperty("height", bottom * h / m_rows - y); + } +} + diff --git a/src/LayoutItem.h b/src/LayoutItem.h new file mode 100644 index 0000000..7c23ca7 --- /dev/null +++ b/src/LayoutItem.h @@ -0,0 +1,68 @@ +#ifndef LAYOUTITEM_H_KEQWS1DN +#define LAYOUTITEM_H_KEQWS1DN + +#include "BaseLayoutItem.h" + + +class LayoutItemAttached: public QObject +{ +Q_OBJECT +Q_PROPERTY(int col MEMBER m_col NOTIFY colChanged) +Q_PROPERTY(int row MEMBER m_row NOTIFY rowChanged) +Q_PROPERTY(int colSpan MEMBER m_colSpan NOTIFY colSpanChanged) +Q_PROPERTY(int rowSpan MEMBER m_rowSpan NOTIFY rowSpanChanged) +public: + explicit LayoutItemAttached(QObject *parent = 0); + ~LayoutItemAttached(); + +signals: + void colChanged(int col); + void rowChanged(int row); + void colSpanChanged(int colSpan); + void rowSpanChanged(int rowSpan); + +private: + int m_col; + int m_row; + int m_colSpan; + int m_rowSpan; +}; /* ----- end of class LayoutItemAttached ----- */ + + +class LayoutItem: public BaseLayoutItem +{ +Q_OBJECT +public: + explicit LayoutItem(QQuickItem *parent = 0); + ~LayoutItem(); + + void addButton(ButtonItem *button); + void clearButtons(); + + static LayoutItemAttached *qmlAttachedProperties(QObject *object); + +protected: + virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + +private: + void setCols(int cols); + void setRows(int rows); + + static int layoutProperty(const ButtonItem *button, const char *property, int fallback); + +private slots: + void recalculateRowColSize(); + void recalculatePositions(); + +private: + int m_rows; + int m_cols; +}; /* ----- end of class LayoutItem ----- */ + +QML_DECLARE_TYPEINFO(LayoutItem, QML_HAS_ATTACHED_PROPERTIES) + +#endif /* end of include guard: LAYOUTITEM_H_KEQWS1DN */ + diff --git a/src/ModeItem.cpp b/src/ModeItem.cpp new file mode 100644 index 0000000..9f48db2 --- /dev/null +++ b/src/ModeItem.cpp @@ -0,0 +1,88 @@ +#include +#include "ButtonItem.h" +#include "LayoutItem.h" +#include "ModeItem.h" + +ModeItem::ModeItem(QQuickItem *parent): + QQuickItem(parent), + m_layout(0) +{ + setLayout(new LayoutItem()); +} + +ModeItem::~ModeItem() +{ +} + +BaseLayoutItem *ModeItem::layout() const +{ + return m_layout; +} + +void ModeItem::setLayout(BaseLayoutItem *layout) +{ + if (m_layout == layout) { + return; + } + + if (m_layout) { + m_layout->setParentItem(0); + delete m_layout; + } + + if (layout) { + layout->setParentItem(this); + foreach (ButtonItem *button, m_buttons) { + m_layout->addButton(button); + } + layout->property("anchors").value()->setProperty("fill", QVariant::fromValue(this)); + } + m_layout = layout; +} + +QQmlListProperty ModeItem::buttons() +{ + return QQmlListProperty( + this, + &m_buttons, + &ModeItem::buttons_append, + &ModeItem::buttons_count, + &ModeItem::buttons_at, + &ModeItem::buttons_clear + ); +} + +void ModeItem::buttons_append(QQmlListProperty *property, ButtonItem *button) +{ + ModeItem *that = static_cast(property->object); + button->setParentItem(that); + that->m_buttons.append(button); + if (that->m_layout) { + that->m_layout->addButton(button); + } +} + +int ModeItem::buttons_count(QQmlListProperty *property) +{ + ModeItem *that = static_cast(property->object); + return that->m_buttons.count(); +} + +ButtonItem *ModeItem::buttons_at(QQmlListProperty *property, int idx) +{ + ModeItem *that = static_cast(property->object); + return that->m_buttons.value(idx, 0); +} + +void ModeItem::buttons_clear(QQmlListProperty *property) +{ + ModeItem *that = static_cast(property->object); + if (that->m_layout) { + that->m_layout->clearButtons(); + } + foreach (ButtonItem *button, that->m_buttons) { + button->setParentItem(0); + } + that->m_buttons.clear(); +} + diff --git a/src/ModeItem.h b/src/ModeItem.h new file mode 100644 index 0000000..a146baf --- /dev/null +++ b/src/ModeItem.h @@ -0,0 +1,43 @@ +#ifndef MODEITEM_H_6ZH81LSX +#define MODEITEM_H_6ZH81LSX + +#include +#include +class ButtonItem; +class BaseLayoutItem; + +class ModeItem: public QQuickItem +{ +Q_OBJECT +Q_PROPERTY(BaseLayoutItem* layout READ layout WRITE setLayout NOTIFY layoutChanged) +Q_PROPERTY(QQmlListProperty buttons READ buttons DESIGNABLE false) +Q_CLASSINFO("DefaultProperty", "buttons") +public: + explicit ModeItem(QQuickItem *parent = 0); + ~ModeItem(); + + // layout property + BaseLayoutItem *layout() const; + void setLayout(BaseLayoutItem *layout); + + // buttons property + QQmlListProperty buttons(); + static void buttons_append(QQmlListProperty *property, ButtonItem *mode); + static int buttons_count(QQmlListProperty *property); + static ButtonItem *buttons_at(QQmlListProperty *property, int idx); + static void buttons_clear(QQmlListProperty *property); + +signals: + void layoutChanged(BaseLayoutItem *layout); + void colsChanged(int cols); + void rowsChanged(int rows); + +private: + BaseLayoutItem *m_layout; + QList m_buttons; + int m_cols; + int m_rows; +}; /* ----- end of class ModeItem ----- */ + +#endif /* end of include guard: MODEITEM_H_6ZH81LSX */ + diff --git a/src/components.pri b/src/components.pri new file mode 100644 index 0000000..c3225e4 --- /dev/null +++ b/src/components.pri @@ -0,0 +1,12 @@ +HEADERS = \ + $$PWD/BaseLayoutItem.h \ + $$PWD/ButtonItem.h \ + $$PWD/KeyboardItem.h \ + $$PWD/LayoutItem.h \ + $$PWD/ModeItem.h +SOURCES = \ + $$PWD/BaseLayoutItem.cpp \ + $$PWD/ButtonItem.cpp \ + $$PWD/KeyboardItem.cpp \ + $$PWD/LayoutItem.cpp \ + $$PWD/ModeItem.cpp diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..7df043d --- /dev/null +++ b/src/src.pro @@ -0,0 +1,6 @@ +CONFIG += plugin +QT += gui quick +DESTDIR = ../generic +TARGET = quickkeyboard +TEMPLATE = lib +include($$PWD/components.pri)