Интегрировать C ++ и QML. Qt 5.4

Последние пару часов я читал документацию по Qt, пытаясь найти способ заставить пользовательский интерфейс, созданный с помощью Qt Quick UI (QML), взаимодействовать (взаимодействовать) с кодом C ++ (функциями … и т. Д.).

Я прочитал 5 или 6 подобных вопросов здесь, но я немного запутался, у меня проблемы с выяснением, с чего начать или что делать в первую очередь.
Я был бы очень признателен, если бы кто-то нашел время и перечислил шаги, необходимые для этой работы.

Что я сделал до сих пор. Я попытался сделать …> добавить новый Item> C ++ класс, но мне не удалось с ошибкой, говорящей: «не удалось добавить один или несколько файлов в проект»> Похоже, файлы (.. .cpp и .h) созданы, они были в папке, где другие файлы проекта были, но не включены в проект.
Я просто хочу изменить текст textedit с помощью функции C ++ или любым другим возможным способом.

//Test.qml (main.qml)

    import QtQuick 2.1
import QtQuick.Window 2.0

Rectangle {
id: rootRect
width: Screen.width/2
height: Screen.height/2
color: "gray"

Button{}

Rectangle{
id: textField
width: 120
height: 40
color: "white"x:274; y: 61
border.color: "blue"border.width: 4
radius: 2

}

TextEdit {

id: display
x: 274
y: 61
width: 80
height: 20
text: qsTr("Text Edit")
font.pixelSize: 22
color: "black"anchors.centerIn: textField

}

Rectangle{
id: inputField
width: textField.width
height: textField.height
border.color: "green"border.width: 3
color: "white"x: 140; y: 61
}

TextEdit{
id: input
color: "red"font.pixelSize: 30
anchors.centerIn: inputField
text: "Some Text"

}

}

//Button.cpl

import QtQuick 2.0
import QtQuick.Window 2.0Item {

property string defaultText: "New Text"

Rectangle{
id: button
width: rootRect.width/6
height: rootRect.height/8
color: "black"x: 200; y: 200
radius: 10

}

MouseArea{
id: buttonClickArea
width: 0
anchors.rightMargin: 0
anchors.bottomMargin: 0
anchors.fill: button

onClicked: {

display.text = defaultText
}
}

}

Спасибо, что нашли время, чтобы прочитать это и / или любые ответы.

6

Решение

Используя Qt 5.4.0 и Qt Creator 3.3.0, создайте новый проект:

  1. Нажмите Новый проект
  2. Qt Quick Application
  3. Нажмите Выбрать …
  4. Назовите проект и выберите, где его разместить
  5. Нажмите кнопку «Далее
  6. Выберите Qt Quick 2.4 из выпадающего меню
  7. Нажмите кнопку «Далее
  8. Выберите желаемый комплект (ы)
  9. Нажмите кнопку «Далее
  10. Нажмите Готово

Теперь вы должны увидеть открытый файл main.qml со следующим кодом:

import QtQuick 2.4
import QtQuick.Window 2.2

Window {
visible: true
MainForm {
anchors.fill: parent
mouseArea.onClicked: {
Qt.quit();
}

}
}

Измените это на:

import QtQuick 2.4
import QtQuick.Window 2.2

//### New Code ###

import QtQuick.Controls 1.3

//################

Window {
id: window1
visible: true

//### New Code ###

width: 400
height: 500

TextArea {
id: textArea
readOnly: true
anchors.bottom: textInput.top
anchors.bottomMargin: 6
anchors.right: parent.right
anchors.rightMargin: 8
anchors.left: parent.left
anchors.leftMargin: 7
anchors.top: parent.top
anchors.topMargin: 7
}

TextField {
id: textInput
y: 470
height: 23
anchors.right: sendButton.left
anchors.rightMargin: 6
anchors.bottom: parent.bottom
anchors.bottomMargin: 7
anchors.left: parent.left
anchors.leftMargin: 7
}

Button {
id: sendButton
x: 328
y: 470
width: 64
height: 23
text: qsTr("Send")
anchors.bottom: parent.bottom
anchors.bottomMargin: 7
anchors.right: parent.right
anchors.rightMargin: 8

onClicked: {
CppClass.sendMessage(textInput.text, textArea);
textInput.text = "";
}
}

//################
}

Добавьте C ++ Class в свой проект:

  1. Щелкните правой кнопкой мыши имя проекта в средстве просмотра проектов.
  2. Нажмите Добавить новый …
  3. Выберите C ++ Class, если еще не выбран
  4. Нажмите Выбрать …
  5. В поле Имя класса введите «CppClass»
  6. Установить базовый класс на QObject
  7. Нажмите кнопку «Далее
  8. Нажмите Готово

Откройте cppclass.h и измените его на:

#ifndef CPPCLASS_H
#define CPPCLASS_H

#include <QObject>

//### New Code ###

#include <QQuickItem>
#include <QQuickTextDocument>
#include <QTextDocument>

//################

class CppClass : public QObject
{
Q_OBJECT
public:
explicit CppClass(QObject *parent = 0);
~CppClass();

//### New Code ###

Q_INVOKABLE void sendMessage(const QString &msg, QQuickItem *textArea);

//################

signals:

public slots:
};

#endif // CPPCLASS_H

Откройте cppclass.cpp и измените его на:

#include "cppclass.h"
CppClass::CppClass(QObject *parent) : QObject(parent)
{

}

CppClass::~CppClass()
{

}
//### New Code ###

void CppClass::sendMessage(const QString &msg, QQuickItem *textArea)
{
QTextDocument *textDocument = textArea->property("textDocument").value<QQuickTextDocument*>()->textDocument();

textDocument->setHtml(textDocument->toHtml() + "\n<b>Text sent to Cpp side:</b> <i>" + msg + "</i>");
}

//################

Откройте main.cpp и измените его на:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

//### New Code ###

#include <QQmlContext>

#include "cppclass.h"
//################

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;

//### New Code ###

CppClass cppClass;

engine.rootContext()->setContextProperty("CppClass", &cppClass);

//################

engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

Запустите приложение, введите текст в поле ввода и нажмите «Отправить».



В ответ на комментарии к Dynamic Remo приведу еще один способ взаимодействия QML и C ++. Этот подход основан на том, что C ++ излучает сигнал, а QML действует на него. Ниже приведен код, чтобы заставить его работать.


cppclass.h

#ifndef CPPCLASS_H
#define CPPCLASS_H

#include <QObject>

#include <QDateTime>

class CppClass : public QObject
{
Q_OBJECT
public:
explicit CppClass(QObject *parent = 0);
~CppClass();

Q_INVOKABLE void getCurrentTime();

signals:
void timeUpdate(QString currentTime);

public slots:
};

#endif // CPPCLASS_H

cppclass.cpp

#include "cppclass.h"
CppClass::CppClass(QObject *parent) : QObject(parent)
{

}

CppClass::~CppClass()
{

}

void CppClass::getCurrentTime()
{
emit timeUpdate(QDateTime::currentDateTime().toString("ddd dd MMMM yyyy hh:mm:ss.zzz"));
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QQmlContext>

#include "cppclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

CppClass cppClass;

QQmlApplicationEngine engine;

engine.rootContext()->setContextProperty("CppClass", &cppClass);

engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

main.qml:

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.2

Window {
id: rootWindow
width: 400
height: 400
visible: true

Connections {
target: CppClass

onTimeUpdate: {
initailizeDllMsg.text = currentTime
}
}

Text {
id: initailizeDllMsg
text: qsTr("{current time placeholder}")
font.pointSize: 14
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}

Button {
id: button1
x: 163
y: 357
text: qsTr("Show current time")
anchors.bottom: parent.bottom
anchors.bottomMargin: 20
anchors.horizontalCenter: parent.horizontalCenter

onClicked: CppClass.getCurrentTime()
}
}
13

Другие решения


По вопросам рекламы [email protected]