Qt Сигналы и слоты — ничего не происходит

В настоящее время я безуспешно пытаюсь подключить сигнал QML к слоту C ++.

Я только что посмотрел на несколько других примеров, но я думаю, что я не понял, как получить корневой объект документа qml …

Моя проблема, кажется, что сигнал будет отправлен из файла qml, но не получен в файле cpp. Нет ошибок при выполнении этого кода.

//Counter.h
#ifndef COUNTER_H
#define COUNTER_H

#include <QObject>

class Counter : public QObject
{
Q_OBJECT

private:
int counter;

public:
explicit Counter(QObject *parent = 0);

signals:
void counterHasChanged(int);

public slots:
void click();
};

#endif // COUNTER_H//counter.cpp
#include "counter.h"#include <QDebug>

Counter::Counter(QObject *parent) :
QObject(parent)
{
this->counter = 0;

qDebug() << "Class Counter created";
}

void Counter::click() {
this->counter++;

qDebug() << "clickRegistered() - emit counterHasChanged()";

emit counterHasChanged(counter);
}//main.cpp
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"#include "counter.h"#include <QObject>
#include <QtQuick>
#include <QDebug>
#include <QQuickItem>
#include <QQmlContext>
#include <QtCore>

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

QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/StatesTest2/main.qml"));
viewer.showExpanded();

QQuickView view;
view.setSource(QUrl::fromLocalFile("qml/StatesTest2/main.qml"));

QObject *item = view.rootObject();

Counter counter;

QObject::connect(item, SIGNAL(click()), &counter, SLOT(click()));

return app.exec();
}//main.qml
import QtQuick 2.0

Rectangle {
id: root
width: 360
height: 360

signal click

Text {
text: qsTr("Hello World")
anchors.centerIn: parent
}

MouseArea {

anchors.fill: parent
onClicked: {
root.click
console.log("click() qml")
}
}

Text {
text: "clicks: "x: 30
y: 250
}

Text {
id: counter
text: "0"x: 75
y: 250
}
}

Я знаю, что есть множество таких тем.
По какой-то причине у меня не получилось другое решение .. может быть, мне стоит сменить IDE: D

0

Решение

Я предлагаю вам добавить счетчик в качестве свойства контекста. Это требует следующих изменений.

//Counter.h
#ifndef COUNTER_H
#define COUNTER_H

#include <QObject>

class Counter : public QObject
{
Q_OBJECT

private:
int counter;

public:
explicit Counter(QObject *parent = 0);

signals:
void counterHasChanged(int Value);

public slots:
void click();
};

#endif // COUNTER_H

Файл Counter.cpp

//counter.cpp
#include "counter.h"#include <QDebug>

Counter::Counter(QObject *parent) :
QObject(parent)
{
this->counter = 0;

qDebug() << "Class Counter created";
}

void Counter::click() {
this->counter++;

qDebug() << "clickRegistered() - emit counterHasChanged()";

emit counterHasChanged(counter);
}

Основной файл .cpp

   //main.cpp
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"#include "counter.h"#include <QObject>
#include <QtQuick>
#include <QDebug>
#include <QQuickItem>
#include <QQmlContext>
#include <QtCore>

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

Counter counter;
QtQuick2ApplicationViewer viewer;
viewer.rootContext()->setContextProperty("counterObj",&counter);

viewer.setMainQmlFile(QStringLiteral("qml/SO_QMLCPPCommunication/main.qml"));viewer.showExpanded();

return app.exec();
}

А в файле qml вы можете получить доступ к слоту объекта Counter, ссылаясь на counterObj.

  //main.qml
import QtQuick 2.0

Rectangle {
id: root
width: 360
height: 360

signal click

Text {
text: qsTr("Hello World")
anchors.centerIn: parent
}

MouseArea {

anchors.fill: parent
onClicked: {
counterObj.click()
console.log("click() qml")
}
}

Text {
text: "clicks: "x: 30
y: 250
}

Text {
id: counter
text: "0"x: 75
y: 250
}
Connections
{
id:cppConnection
target:counterObj
ignoreUnknownSignals : true
onCounterHasChanged:{
//To access signal parameter,please name the parameter.
console.debug("Counter value changed")
counter.text = Value
}
}

}
2

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

QQuickView::rootObject() возвращает вам QQuickItem который, по-видимому, на Qt5.0 не имеет каких-либо щелчок сигнал (http://qt-project.org/doc/qt-5.0/qtquick/qquickitem.html)

Убедитесь, что вы связываете правильный (существующий) сигнал с правым слотом и что сигнал действительно вызывается.

0

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