Выбери формат для чтения
Загружаем конспект в формате pptx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Интеграция QMLинтерфейсов и логики
приложения на языке C++
Qt
Qt – это кроссплатформенный (включая мобильные платформы) фреймворк
для разработки приложений на C++.
В Qt предусмотрены классы и для работы со строками, файлами, сетью,
базами данных, XML, для обеспечения многопоточности в приложении и др.
2
Qt. Состав
Библиотека Qt;
moc;
qmake;
Qt Creator;
Qt Designer;
Qt Linguist;
Qt Assistant.
3
Qt. Объектная модель
Qt добавляет к C++ следующие возможности:
механизм для взаимодействия объектов – сигналы и слоты;
свойства объектов;
события и фильтры событий;
контекстный перевод строк для интернационализации.
4
Qt. Объектная модель
QObject – базовый класс всех Qt-объектов.
// myclass.h
#include
// myclass.cpp
#include "myclass.h"
class MyClass : public QObject {
Q_OBJECT
private:
int pivateField;
public:
MyClass(int arg);
Q_INVOKBALE void publicMethod(int arg);
private slots:
void mySlot();
signals:
mySignal();
}
MyClass::MyClass(int arg) : QObject() {
//...
}
void MyClass::publicMethod(int arg) {
//...
}
void MyClass::mySlot() {
//...
}
5
Qt. Система мета-объектов
Система мета-объектов основана на трех вещах:
Класс QObject предоставляет базовый класс для объектов, которые могут
воспользоваться мета-объектной системой.
Макрос Q_OBJECT используется для включения возможностей метаобъектов, таких как динамические свойства, сигналы и слоты.
Мета-объектный компилятор moc предоставляет каждому подклассу
QObject необходимый код для реализации мета-объектных
возможностей.
6
Qt. Система мета-объектов. QMetaObject
QMetaObject – класс, содержащий мета-информацию о Qt-объектах.
Методы:
QObject* newInstance(...);
bool invokeMethod(...).
QMetaObject *meta = MyClass::metaObject();
meta->newInstance(Q_ARG(int, 1));
meta->invokeMethod(MyClass(), "publicMethod", Q_ARG(int, 10));
7
Qt. Свойства
Q_PROPERTY(type name READ getMethod [WRITE setMethod] [RESET resetMethod]
[DESIGNABLE bool] [STORED bool] [USER bool])
type name – тип и имя свойства;
getMethod – метод для считывания значения;
setMethod – метод для установки значения свойства;
resetMethod – метод для установки значения свойства по умолчанию;
DESIGNABLE – показывать ли свойство в Qt Designer (true);
STORED – сохраняется ли при сохранении состояния объекта (true);
USER — редактируется ли свойство пользователем (false).
8
Qt. Свойства. Пример
class MyClass : public QObject {
Q_OBJECT
Q_PROPERTY(QString text READ getText WRITE setText)
private:
QString text;
public:
MyClass();
QString getText();
void setText(QString newText);
};
9
Qt. Сигналы и слоты
Сигналы и слоты – механизм взаимодействия объектов между собой.
class MyClass : public QObject {
Q_OBJECT
private:
QString text;
public:
MyClass();
QString getText();
void setText(QString newText);
private slots:
void printText();
signals:
void textChanged();
};
MyClass::MyClass() : QObject() {
}
QString MyClass::getText() {
return text;
}
void MyClass::setText(QString
newText) {
text = newText;
emit textChanged();
}
void MyClass::printText() {
qDebug() << "New text: " + text;
}
10
Qt. Сигналы и слоты. Подключение
int main(int argc, char *argv[]) {
MyClass myObject;
QObject::connect(&myObject1, SIGNAL(textChanged()), &myObject2, SLOT(printText());
myObject.setText("Slots and signals");
return 0;
}
int main(int argc, char *argv[]) {
MyClass myObject1;
MyClass myObject2;
QObject::connect(&myObject1, SIGNAL(textChanged()), &myObject2, SLOT(printText());
// эквивалент
myObject2.connect(&myObject1, SIGNAL(textChanged()), SLOT(printText()));
myObject1.setText("Slots and signals");
return 0;
}
11
Qt. Сигналы и слоты. Отключение
QObject::disconnect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method)
// Отключить всё от сигналов отправляемых объектом myObject1:
QObject::disconnect(&myObject1, 0, 0, 0);
// То же самое, но в виде метода объекта myObject1:
myObject1.disconnect();
// Отключить всё от сигнала SIGNAL, отправляемого объектом myObject1:
QObject::disconnect(&myObject1, SIGNAL(textChanged()), 0, 0);
// То же самое,но в виде метода объекта myObject1:
myObject1.disconnect(SIGNAL(textChanged()));
// Отключить получателя myObject2 от сигналов myObject1:
QObject::disconnect(&myObject1, 0, &myObject2, 0);
// То же самое,но в виде метода объекта myObject1:
myObject1.disconnect(&myObject2);
12
Контейнерные классы
QVector;
QByteArray;
QList;
QStack;
QQueue;
QMap;
QHash;
QSet;
QString;
QVariant.
13
QVector
QVector
append(const T &value) – добавляет элемент в конец вектора;
insert(int index, const T &value) – добавляет элемент по индексу;
T& at(int index) – получить элемент по индексу;
int count() – количество элементов в векторе;
remove(int index) – удаляет элемент по индексу;
QVector
vec;
int removeAll(const
T &value) – удаляет все элементы с таким значением;
vec.append(10);
QList toList() – возвращает QList, созданный из элементов вектора.
vec.append(20);
vec.append(30);
qDebug() << vec; // QVector(10,20,30)
qDebug() << vec[0]; // 10
14
QByteArray
double toDouble() – возвращает массив преобразованный в double;
float toFloat() – возвращает массив преобразованный во float;
QByteArray toHex() – возвращает копию массива в 16-теричном виде;
int toInt() – возвращает массив преобразованный в int;
long toLong() – возвращает массив преобразованный в long;
QByteArray x("free");
short toShort()
– возвращает массив преобразованный в short.
QByteArray
y("dom");
x.append(y); // x = "freedom"
QByteArray byteArray("1234.56");
double a = byteArray.toDouble(); // a = 1234.56
15
QList
QList
move(int from, int to) – перемещает элемент с одной позиции на другую;
swap(int index1, int index2) – меняет местами два элемента по индексам;
T takeAt(int index) – возвращает и удаляет указанный элемент из списка;
T takeFirst() – возвращает и удаляет первый элемент из списка;
T takeLast() – возвращает и удаляет последний элемент из списка;
QList list;
QSet toSet() – возвращает QSet с данными из списка;
list.append(1);
list.append(4);
QVector toVector() – возвращает QVector с данными из списка.
list.append(2);
int first = list.takeFirst(); // first = 1
int last = list.takeLast(); // last = 2
16
QStack
QStack
push(const T &value) – добавляет элемент в стек;
T pop() – извлекает элемент из стека;
T& top() – возвращает ссылку на верхний элемент в стеке;
swap(QStack &other) – заменяет элементы стека элементами другого.
QStack stack;
stack.push("Element 1");
stack.push("Element 2");
stack.push("Element 3");
while (!stack.empty()) {
qDebug() << stack.pop();
}
17
QQueue
QQueue
void enqueue(const T &value) – добавляет значение в конец очереди;
T dequeue() – извлекает значение из начала очереди;
T& head() – возвращает ссылку на начальный элемент очереди.
QQueue queue;
queue.enqueue("Element 1");
queue.enqueue("Element 2");
queue.enqueue("Element 3");
while (!queue.empty()) {
qDebug() << queue.dequeue();
}
18
QMap
QMap
Key key(const T &value) – возвращает ключ элемента по значению;
QList keys() – возвращает список ключей ;
const T value(const Key &key) – возвращает значение элемента по ключу;
QList values() – список всех значений.
QMap mapPhonebook;
mapPhonebook["Piggy"] = "785 11 11";
mapPhonebook["Kermit"] = "123 65 56";
mapPhonebook["Gonzo"] = "631 32 21";
qDebug() << mapPhonebook.keys(); // ["Piggy", "Kermit", "Gonzo"]
qDebug() << mapPhonebook.values(); // ["785 11 11", "23 65 56", "631 32 21"]
19
QHash
QHash
Отличия от QMap:
в QMap элементы отсортированы по ключу, в QHash – произвольно;
QHash предоставляет более быстрый поиск, чем QMap.
QHash hashPhonebook;
hashPhonebook["Piggy"] = "785 11 11";
hashPhonebook["Kermit"] = "123 65 56";
hashPhonebook["Gonzo"] = "631 32 21";
qDebug() << hashPhonebook.keys(); // ["Piggy", "Kermit", "Gonzo"]
qDebug() << hashPhonebook.values(); // ["785 11 11", "23 65 56", "631 32 21"]
20
QSet
QSet
QSet& unite(const QSet &other) – объединение;
QSet& intersect(const QSet &other) – пересечение;
QSet& subtract(const QSet &other) – разность.
QSet set1;
QSet set2;
set1 << "Lorem" << "Ipsum";
set2 << "Amet" << "Lorem";
QSet resultSet = set1;
resultSet.unite(set2);
qDebug() << "Unite = " << resultSet.toList(); // Unite = ["Lorem", "Ipsum", "Amet"]
21
QString. Основные свойства
QString arg(T &argument) – определяет параметр внутри строки;
QStringList split(QString &sep) – делит строку на подстроки;
QString trimmed() – удаляет пробельные символы из строки;
bool startsWith(QString &s) – начинается ли строка с строки s;
bool endsWith(QString &s) – заканчивается ли строка с строки s;
QString toLower() – возвращает строку в нижнем регистре;
QString toUpper() – возвращает строку в верхнем регистре.
22
QString. Пример
QString fileName = "dict.txt";
QString directory = "files/";
QString status = QString("Processing file %1 from %2")
.arg(fileName).arg(directory); // status = "Processing file dict.txt from files/"
QStringList list = status.split(" "); // list = ["Processing", "file", "dict.txt", "from", "files"]
QString trimmed = status.trimmed(); // trimmed = "Processingfiledict.txtfromfiles/"
QString lower = status.toLower(); // lower = "processing file dict.txt from files/"
QString upper = status.toUpper(); // upper = "PROCESSING FILE DICT.TXT FROM FILES/"
bool startsWith = status.startsWith("Process"); // startsWith = true
bool endsWith = status.endsWith("Process"); // endsWith = false
23
QVariant
void setValue(const T &value) – записывает значение в объект;
T value() – возвращает значение объекта;
bool toBool() – преобразует значение объекта в bool и возвращает;
double toDouble() – преобразует значение в double и возвращает;
float toFloat() – преобразует значение в float и возвращает;
int toInt() – преобразует значение в int и возвращает;
QVariant
var;
QList
toList() – преобразует значение в список и возвращает;
var.setValue(5);
intQMap
toMap() =– 5преобразует значение в словарь;
float float_number = var.toInt(); // float_number = 5.0
QString
strtoString()
= var.toString();
// str = "5" значение в строку и возвращает.
QString
– преобразует
24
Создание классов, доступных в QML
1. Унаследовать класс от QObject;
2. Добавить макрос Q_OBJECT.
// myclass.h
#include
class MyClass : public QObject {
Q_OBJECT
private:
public:
MyClass();
private slots:
signals:
};
// myclass.cpp
#include "myclass.h"
MyClass::MyClass() : QObject() {
//...
}
25
Создание классов, доступных в QML
// myclass.h
#include
// myclass.cpp
#include "myclass.h"
class MyClass : public QObject {
Q_OBJECT
Q_PROPERTY(QString text READ getText WRITE setText
MyClass::MyClass() : QObject() {
}
QString MyClass::getText() {
return text;
}
void MyClass::setText(QString &newText)
{
text = newText;
}
NOTIFY textChanged)
private:
QString text;
public:
MyClass();
QString getText();
void setText(QString &newText);
private slots:
signals:
void textChanged();
};
26
Создание классов, доступных в QML
// myclass.h
#include
class MyClass : public QObject {
Q_OBJECT
Q_PROPERTY(QString text READ getText WRITE setText
NOTIFY textChanged)
private:
QString text;
public:
MyClass();
QString getText();
void setText(QString &newText);
Q_INVOKABLE void printText();
private slots:
signals:
void textChanged();
};
// myclass.cpp
#include "myclass.h"
#include
MyClass::MyClass() : QObject() {
}
QString MyClass::getText() {
return text;
}
void MyClass::setText(QString &newText)
{
text = newText;
}
void MyClass::printText() {
qDebug() << text;
}
27
Создание классов, доступных в QML
#include
#include
#include
#include "myclass.h"
int main(int argc, char *argv[]) {
QGuiApplication* app = SailfishApp::application(argc, argv);
//...
qmlRegisterType("harbour.appname.MyModule", 1, 0, "MyClass");
//...
return app->exec();
}
28
Создание классов, доступных в QML
import harbour.appname.MyModule 1.0
Page {
MyClass {
id: myClass
text: "My Class Text"
}
SilicaFlickable {
Column {
anchors.fill: parent
PageHeader { title: "Page"}
Label { text: myClass.text }
Button {
width: parent.width
text: "Button"
onClicked: myClass.printText()
}
}
}
}
29
QML плагины
QML компоненты, написанные на языке C++ есть возможность перенести в
QML плагин. Плагины QML позволяют следующее:
производить регистрацию QML компонент, написанных на C++
инициализировать движок QML при подключении плагина
использовать содержимое плагина в нескольких приложениях
30
QQmlExtensionPlugin
// example-plugin.h
class ExamplePlugin : public QQmlExtensionPlugin {
Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
void registerTypes(const char* uri);
void initializeEngine(QQmlEngine *engine, const char *uri);
};
// example-plugin.cpp
void ExamplePlugin::registerTypes(const char* uri) {
qmlRegisterType(uri, 1, 0, "ExampleClass");
}
31
Настройка проекта плагина
TEMPLATE = lib
TARGET = ExampleModule
...
uri = org.application.ExampleModule
qmldir.files = qmldir qml/CustomQmlComponent.qml
installPath = /usr/lib/example-application/$$replace(uri, \\., /)
qmldir.path = $$installPath
target.path = $$installPath
INSTALLS += target qmldir
32
Файл qmldir
Два типа файлов qmldir:
Файлы со списком директорий QML-документов;
Файлы с описанием QML-модулей.
module org.application.ExampleModule
CustomQmlComponent 1.0 CustomQmlComponent.qml
plugin ExamplePlugin
33
Настройка приложения
int main(int argc, char *argv[]) {
QGuiApplication* app = SailfishApp::application(argc, argv);
QQuickView* view = SailfishApp::createView();
view->engine()->addImportPath("/usr/lib/example-application/");
view->setSource(SailfishApp::pathTo("qml/example-application.qml"));
view->showFullScreen();
QObject::connect(view->engine(), &QQmlEngine::quit, app,
&QGuiApplication::quit);
return app->exec();
}
34
Использование QML плагина
import org.application.ExampleModule 1.0
CustomQmlComponent { // Класс определен в QML (qml/CustomQmlComponent.qml)
ExampleClass {
// Класс определен в C++ (example-plugin.cpp)
id: exampleClass
}
//...
}
35