5

qt 5.1 で qml シグナルを qt スロットに接続したいと思います。このバージョンの qt では DeclarativeView を使用できません。私のqml要素は単純な長方形で、onClickedイベントでシグナルを開始します。

Rectangle{
    id:test
    width:  200
    height: 50
    x: 10
    y: 10
    signal qmlSignal()
    MouseArea {
        hoverEnabled: false
        anchors.fill: parent
        onClicked: {

            console.log("geklickt")
            test.qmlSignal()


        }
}

このヘッダーを持つクラス SignalslotlistView があります。

class SignalslotlistView: public QObject{
Q_OBJECT
public slots:
void cppSlot(const QString &msg);

};

そして.cpp

void SignalslotlistView::cppSlot(const QString &msg) {

qDebug() << "Called the C++ slot with message:" << msg;}

MainWindow クラスでは、接続を設定しようとしています。

view->setSource(QUrl::fromLocalFile("main.qml"));
QObject *object = (QObject *)view->rootObject();
QObject *rect = object->findChild<QObject*>("test");

SignalslotlistView myClass;
    QObject::connect(rect, SIGNAL(qmlSignal()),
                     &myClass, SLOT(cppSlot()));

ビューはタイプ QQuickView からのものです。

しかし、何も起こりません。ありがとうございました。

4

1 に答える 1

3

クラウディア、あなたの主な問題は、QML シグナル タイプがスロット タイプと互換性がないことです。と を使用して修正しsignal qmlSignal(string msg)ましたmain.cpp

QObject *rect = dynamic_cast<QObject*>(view->rootObject());
SignalslotlistView myClass;
QObject::connect(rect, SIGNAL(qmlSignal(QString)),
                 &myClass, SLOT(cppSlot(QString)));

これで、C++ 側で QML シグナルを受信できるようになりました。

于 2013-10-26T08:05:13.790 に答える