2020年12月21日星期一

Invoke slot of child of child of QQmlPropertyMap?

Before marking this as a duplicate of "Can't call slot or Q_INVOKABLE from QML in subclass of QQmlPropertyMap," please read the final response (https://stackoverflow.com/a/18674363/447438).

I am working on a design where I have a class (call it MyBaseClass) that inherits from QQmlPropertyMap. It implements some additional behaviors for my system which are then used by other classes that inerit from MyBaseClass (e.g. ChildClass).

From QML, (QtQuick), I wish to invoke a slot (mySlot()) of ChildClass. When I try, I get the following issues in the Application Output (mentioning MyBaseClass) even though I am only using ChildClass.

qrc:/main.qml:17: TypeError: Property 'mySlot' of object MyBaseClass(0x55f88ef86b50) is not a function  qrc:/main.qml:24: TypeError: Property 'mySlot' of object MyBaseClass(0x55f88ef86b50) is not a function  

I also tried implementing sending signals from QML, but I get a similar issue trying to bind to the QML emitted signals. (I am not adding that example.)

For those suggesting I just inherit QQmlPropertyMap into ChildClass (in addition to MyBaseClass to which it already has the proper inheritance and intialization via the protected method), the result is not pretty:

/home/jwerner/Projects/InheritanceTest-simple/ChildClass.h:8: warning: direct base 'QQmlPropertyMap' is inaccessible due to ambiguity:      class ChildClass -> class MyBaseClass -> class QQmlPropertyMap      class ChildClass -> class QQmlPropertyMap  

My "gut" says that the problem is I am not doing things the "Qt Way," but I can't figure out what it is.

Here is the minimum example code of the problem to demonstrate the problem. (I'm leaving out the .pro file since it is trivial to make.)

MyBaseClass.h

#include <QQmlPropertyMap>    class MyBaseClass : public QQmlPropertyMap  {      Q_OBJECT  public:      explicit MyBaseClass(QObject *parent = nullptr)          : QQmlPropertyMap(this, parent)      {}    };  

ChildClass.h

#include "MyBaseClass.h"  #include <QObject>  #include <QDebug>    class ChildClass : public MyBaseClass  {      Q_OBJECT  public:      ChildClass(QObject *parent = nullptr)          : MyBaseClass(parent) {}    public slots:      void mySlot() {          qDebug() << "This is mySlot";      };  };  

main.qml

import QtQuick 2.15  import QtQuick.Window 2.15      Window {      id: theMainWindow      width: 640      height: 480      visible: true      title: qsTr("Hello World")        property QtObject   cData: childData;        onCDataChanged: {          childData.mySlot();      }        Timer { // wait a bit before calling          repeat: false          interval: 2000          running: true          onTriggered: childData.mySlot();      }  }  

main.cpp

int main(int argc, char *argv[])  {  #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)      QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);  

没有评论:

发表评论