Справочник от Автор24
Поделись лекцией за скидку на Автор24

Интеграция QML-интерфейсов и логики приложения на языке C++

  • 👀 211 просмотров
  • 📌 168 загрузок
Выбери формат для чтения
Статья: Интеграция QML-интерфейсов и логики приложения на языке C++
Найди решение своей задачи среди 1 000 000 ответов
Загружаем конспект в формате pptx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Интеграция QML-интерфейсов и логики приложения на языке C++» pptx
Интеграция 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
«Интеграция QML-интерфейсов и логики приложения на языке C++» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot