Подключение qml-сигналов к Qt - PullRequest
2 голосов
/ 10 мая 2011

Я пытаюсь использовать представление qml-grid в своем коде. Я пытаюсь соединить это с моим C ++ кодом. Я динамически создал модель представления списка и передал файл qml. Работает нормально. Однако я сталкиваюсь с проблемой, когда хочу подключить сигнал Qml к коду Qt / c ++. Я обработал mouseArea в своем Qml-прямоугольнике и излучал оттуда сигнал.

Я пытаюсь подключиться к сигналу следующим образом:

QDeclarativeView *pQMLContainer = NULL;
TempWidget *pTemp = new TempWidget();
pQMLContainer = new QDeclarativeView(pTemp);
pQMLContainer->setResizeMode(QDeclarativeView::SizeRootObjectToView);
pQMLContainer->rootContext()->setContextProperty("imgModel", createModel() );
pQMLContainer->setSource(QUrl("../Temp/qml/gridview-example.qml"));
QObject *rootObject = dynamic_cast<QObject*>pQMLContainer->rootObject();
QObject::connect(rootObject, SIGNAL(keyPressed()), pTemp, SLOT(onKeyPressed()));

Когда выполняется оператор connect, я получаю сообщение об ошибке: не удается подключиться к объекту «null». При отладке я обнаружил, что никогда не смогу получить «rootObject» в качестве действительного указателя. Куда я иду не так?

Спасибо

Ответы [ 5 ]

1 голос
/ 11 мая 2011

Код довольно прямой:

в .cpp файле:

ui->declarativeView->setSource(QUrl("qrc:/Resources/main.qml"));
QGraphicsObject *obj = ui->declarativeView->rootObject();
connect ( obj, SIGNAL(clicked()), this, SLOT(itemClicked()));

и файл QML:

import Qt 4.7

Rectangle {
    width: 100
    height: 100
    id: rect

    signal clicked

    Text {
        text: "Hello World"
        anchors.centerIn: parent
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            rect.clicked();
        }
    }
}

еще одна вещь, проверьте расположение вашего файла qml, он должен быть доступен для двоичного файла.

1 голос
/ 10 мая 2011

Можете ли вы попробовать это?(это пример кода из Qt Docs )

QObject *item = pQMLContainer->rootObject();
QObject::connect(item, SIGNAL(keyPressed()),
                  pTemp, SLOT(onKeyPressed()));
0 голосов
/ 12 мая 2011

Я мог бы наконец-то заставить это работать. Я не уверен, что это реальное решение проблемы, но, наконец, это заработало: Я устанавливал путь qml как относительный путь к моей рабочей папке. И да, путь был действительно правильным, так как я мог видеть qml и его содержимое. Я просто случайно изменил путь qml относительно рабочей папки на «qrc» следующим образом:

pQMLContainer->setSource(QUrl("qrc:/gridview-example.qml"));
instead of:
pQMLContainer->setSource(QUrl("../Temp/qml/gridview-example.qml"));

и он начал работать. Я не уверен, что мне нужно было добавить qml в qrc (я только начал использовать qml).

Спасибо всем за вашу поддержку! Mots

0 голосов
/ 10 мая 2011

QGraphicsObject - это QObject, поэтому не требуется выполнять приведение.Если ваш компилятор жалуется, попробуйте добавить #include <QGraphicsObject>.

Просто приведение без компилятора, зная, что классы вызывают проблемы.(Тем более что здесь задействовано множественное наследование.)

0 голосов
/ 10 мая 2011

Возможно, вам следует использовать qobject_cast вместо dynamic_cast? Смотрите, например вопрос dynamic_cast возвращает NULL, но не должно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...