сигналы — ошибка связывания приложения QtQuick и слотов C ++

Я нахожусь в процессе изучения кодирования приложений QtQuick с использованием C ++ на заднем плане. Я планирую написать как можно больше кода в QtQuick (QML), но я не смог найти одну вещь, поэтому решил использовать C ++. По сути, мне нужно создать приложение, которое предоставляет пользователю определенные виджеты и одну кнопку. После нажатия на кнопку создается и вызывается команда CLI. Я могу создать эту команду CLI, используя javascript, но я не нашел способа выполнить эту команду, поэтому я решил для C ++.

План состоит в том, чтобы зарегистрировать сигнал на кнопке в QML и соединить этот сигнал со слотом в C ++. Я открыл документацию по QML, где нашел несколько полезных примеров. Мой код тестового приложения содержит два исходных файла:

main.qml:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.1
import "scripts.js" as LogicApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
minimumHeight: 480
minimumWidth: 640ColumnLayout{
spacing: 2
height: parent.height - 100
width: parent.width

GridLayout {
id: grid
columns: 3

Label { text: "Vstupni soubor";  }
TextField {
id: input_file_field
}
Button {
text: "..."onClicked: fileDialogInputFile.open()
}Label { text: "Vystupni adresar";  }
TextField {id: output_dir_field}
Button {
text: "..."onClicked: fileDialogOutputDir.open()
}

CheckBox{
id: opt1
text: "Volba 1"}

CheckBox{
id: opt2
text: "Volba 2"}

CheckBox{
id: opt3
text: "Volba 3"}

}

Button {

signal qmlSignal(string msg)
objectName: "myButton"
text: "Analyzuj"onClicked: {
qmlSignal("Hello from QML")
console.log("Nahodne cislo " + Logic.func())
}
}

}TextArea {
id: log_output
width: parent.width
height: 100
y: parent.height - 100
readOnly: true
text: "Log zprav";
}

FileDialog {
id: fileDialogInputFile
title: "Please choose a file"onAccepted: {
input_file_field.text = fileDialogInputFile.fileUrl
}
}

FileDialog {
id: fileDialogOutputDir
title: "Please select output directory"selectFolder: true
onAccepted: {
output_dir_field.text = fileDialogOutputDir.fileUrl
console.log("You chose: " + fileDialogOutputDir.fileUrl)
}
}}

main.cpp:

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
#include <QObject>

class MyClass : public QObject
{
Q_OBJECT

public slots:
void cppSlot(const QString &msg) {
qDebug() << "Called the C++ slot with message:" << msg;
}
};int main(int argc, char *argv[]) {
qDebug() << "Hello World - main!";

QGuiApplication app(argc, argv);

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

MyClass myClass;
QObject *win = engine.rootObjects()[0];
QObject *item = win->findChild<QObject*>("myButton");

QObject::connect(item, SIGNAL(qmlSignal(QString)),
&myClass, SLOT(cppSlot(QString)));

return app.exec();
}

Программа может быть скомпилирована и запущена. Когда я запускаю программу, я вижу это на консоли:

QML debugging is enabled. Only use this in a safe environment.
Hello World - main!
QObject::connect: No such slot MyClass::cppSlot(QString) in ../pokus/main.cpp:30
QObject::connect:  (sender name:   'myButton')

Это означает, что программа работает, но не может подключить cppSlot к сигналу, генерируемому моей кнопкой. У меня проблема в том, что я следовал руководству по QML, а блоги посвящены самым сложным проблемам, т. Е. Я провел целый день, гугляя без какого-либо результата …

0

Решение

Ваш код не компилируется:

debug/main.o: In function `MyClass::MyClass()':
/home/micurtis/dev/test/guitest/main.cpp:6: undefined reference to `vtable for MyClass'

Если я #include "main.moc" и удалите ссылки на Logic.js, это работает для меня, когда я нажимаю на «Analyzuj»:

    // ...
return app.exec();
}

#include "main.moc"

Выход:

Starting /home/micurtis/dev/test/guitest/guitest...
QML debugging is enabled. Only use this in a safe environment.
Hello World - main!
Called the C++ slot with message: "Hello from QML"/home/micurtis/dev/test/guitest/guitest exited with code 0
0

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


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