2013-06-04 2 views
0

++ У меня есть следующий код:QML с сигналом и слоты

main.cpp

QDeclarativeView *qmlView = new QDeclarativeView(); 
qmlView->setSource(QUrl("qrc:/nav.qml")); 
ui->nav->addWidget(qmlView); 
Blockschaltbild bild; 
QObject *value = qmlView->rootObject(); 
QObject::connect(value, SIGNAL(testSig()), &bild, SLOT(BlockSlot())); 

Сигналы и слоты подключения правильно. (QObject :: подключить возвращает "истина")

QML файл:

Rectangle { 
    id: rectangle1 
    .... 
    signal testSig() 
    MouseArea{ 
     id: mousearea 
     anchors.fill: parent 
     onEntered: parent.color = onHoverColor 
     onExited: parent.color = parent.buttonColor 
     onClicked: { 
         rectangle1.testSig() 
         console.log("Button clicked") 
        } 
    } 
} 

Это где слот расположен:

Blockschaltbild.h

class Blockschaltbild: public QObject 
{ 
    Q_OBJECT 
public slots: 
    void BlockSlot(){ 
     cout << "Slot is working" << endl; 
    } 
public: 
    .... 
} 

Если я нажимаю на область мыши, на консоли отображается «Кнопка нажата», но не «Слот работает». Я использую Qt 4.8.4 с QtQuick 1.1. Где моя ошибка?

+0

Это опечатка, которую вы написали 'restSig()' вместо 'testSig()'? И имеет ли прямоугольник 'id: rectangle1'? – leemes

+0

Да, это была опечатка. Я только что исправил это. rectangle1 - это идентификатор прямоугольника. Я просто забыл написать там. – shtdown

+0

Попробуйте переместить определение BlockSlot в файл .cpp, потому что Qt будет генерировать MOC-файл и связывать его с файлом cpp. – Dmitry

ответ

0

Если вам просто нужно работать с объектом Blockschaltbild в QML, вы также можете принять решение против свободной связи с сигналом и слотами и просто передать свой объект в качестве параметра контекста, чтобы сделать его доступным в QML.

QDeclarativeView *qmlView = new QDeclarativeView(); 
qmlView->setSource(QUrl("qrc:/nav.qml")); 
ui->nav->addWidget(qmlView); 

Blockschaltbild* bild; 
QObject *value = qmlView->engine().rootContext()->setContextProperty("bild", bild); 

Вы можете вызвать BlockSlot() слот вашего объекта из QML с:

Rectangle { 
    id: rectangle1 
    .... 

    MouseArea{ 
     id: mousearea 
     anchors.fill: parent 
     onEntered: parent.color = onHoverColor 
     onExited: parent.color = parent.buttonColor 
     onClicked: { 
      bild.BlockSlot() // call BlockSlot of "bild" context property 
      console.log("Button clicked") 
     } 
    } 
} 

Это также возможно использовать qmlRegisterType, который позволяет создавать экземпляры вашего Blockschaltbild класса с QML. См. here для получения дополнительной информации.

Смежные вопросы