Sygnał C++ do gniazda QML w Qt

Chcę wysłać sygnał z C++ do gniazda w moim pliku QML. Już działa bez i prymitywnych parametrów typu, chociaż jeśli chcę wysłać QString do mojego gniazda QML dostaję błąd podczas łączenia.

Podłączam się w main.cpp

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj,      SIGNAL(finishedGatheringDataForItem(QString)), 
                 contentView, SLOT(updateViewWithItem(QString)));

Relawantna część mojego pliku qml

Rectangle {
        objectName: "contentView"
        function updateViewWithItem(string) { console.log('got some Items'); }  // slot
}

Błąd:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
Author: underscore_d, 2012-01-12

3 answers

Myślę, że najlepiej będzie, jeśli sprawdzisz ten tutorial:

Http://doc.qt.io/qt-4.8/qtbinding.html

Szczególnie ta sekcja:

Http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals

Myślę, że Twoim błędem w tym przypadku może być albo to, że nie zadeklarowałeś tego jako miejsca, albo nie sprawiłeś, że można go przywołać. Obie opcje są wyjaśnione w samouczku Qt.

Ponadto, musisz użyć QVariant w celu wymiany danych między C++ i QML. Możesz także rejestrować typy, np. widżety i inne rzeczy, aby móc używać ich w QML jako" natywnego " typu, jak prostokąt. W większości przypadków nie jest to zalecane, z wyjątkiem sytuacji, gdy potrzebujesz pewnej klasy extern lub danych, których nie możesz wyświetlić w innym miejscu w interfejsie QML.

Powodem QVariant jest Skryptowe podejście QML. QVariant zasadniczo zawiera dane użytkownika i opis typu danych, dzięki czemu QML wie, jak prawidłowo je obsługiwać. Dlatego parametr w QML należy podać za pomocą String, int itd.. Ale oryginalna wymiana danych z C++ pozostaje QVariant

Używałem wcześniej qmlRegisterType, ale jest to bardzo niewygodne rozwiązanie dla prostych typów danych. Jest raczej używany do bardziej złożonych danych, takich jak niestandardowe widżety, Elementy Canvas lub wideo, które QML nie obsługuje natywnie ani nie rozszerza QStandardItemModels . Jest to wygodniejszy sposób wymiany danych pomiędzy QML i C++ i nie wymaga sygnałów ani slotów w pierwszej wystąpienia, ponieważ QStandardItemModel automatycznie aktualizuje GUI. Aby używać modelu QStandardItemModel, musisz zarejestrować typ w qmlRegisterType.. . Model może być następnie używany w widokach opartych na modelu, takich jak ListView itp.

Załączam tutorial do tego tematu, który opisuje jak korzystać z QListModel.

Http://doc.qt.io/qt-4.8/qdeclarativemodels.html

 35
Author: mmoment,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 15:34:18

Należy użyć Połączenia w tym przypadku (może to jedyny sposób na połączenie).

  1. Umieść swój obiekt myObj do pliku QML przez setContextProperty

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
    
  2. Twój sygnał to

    finishedGatheringDataForItem(QString signalString)
    
  3. W pliku QML dodaj Polubienia Connectios poniżej:

    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    
 37
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-12 08:49:08

Rozwiązanie bez Connections i dowolnego kontekstu polega na podłączeniu Nie gniazda sygnału, ale sygnału-sygnału. Znaleziono tutaj . Przykładowy kod jest następujący.

Qml:

Window{
    signal qmlSend(string textOut)
    signal qmlReceive(string textIn)
    onQmlReceive:{
      console.log(textIn)
    }
}

Plik nagłówkowy klasy Background zawiera

public signals:
    void cppSend(QString textOut);
public slots:
    void cppReceive(QString textIn);

I main.cpp łączy je w ten sposób:

1.Z qml na cpp:

QObject::connect(qmlRootObject, SIGNAL(qmlSend(QString)),
                backgroundObject, SLOT(cppReceive(QString)));

2.Z cpp do qml:

QObject::connect(backgroundObject, SIGNAL(cppSend(QString)),
                 qmlRootObject, SIGNAL(qmlReceive(QString)));
 2
Author: PolyGlot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-01 07:51:44