Название: при вызове функции С + + с qml, вылетает :(
Отправлено: red_spider от Ноябрь 07, 2011, 00:11
при вызове функции С + + с qml вылетает если вызов делать в тот же класс где происходит соединение с qml, а если вызов в иной класс тогда проблемы просьба сильно ногами бе бить :) с QML не так давно знаком буду благодарен за помощь :) main.cpp#include <QtGui/QApplication> #include "connect.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); cennect w; w.LoadQml(true); return a.exec(); }
mainwindow.h#ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QtGui>
class MainWindow : public QObject { Q_OBJECT
public: MainWindow(QObject *parent = 0); ~MainWindow(); Q_INVOKABLE void clic(); };
#endif // MAINWINDOW_H
mainwindow.cpp#include <QtGui> #include <QDeclarativeView> #include <QDeclarativeContext> #include <QDebug> #include "mainwindow.h"
MainWindow::MainWindow(QObject *parent) : QObject(parent) { }
MainWindow::~MainWindow() {
}
void MainWindow::clic() { QApplication::quit(); }
connect.h#ifndef CENNECT_H #define CENNECT_H
#include <QObject> #include <QDeclarativeView> class cennect : public QObject { Q_OBJECT public: explicit cennect(QObject *parent = 0); QDeclarativeView *m_Tr; void LoadQml(const bool &v); Q_INVOKABLE void red(); signals:
public slots:
};
#endif // CENNECT_H
connect.cpp#include <QtGui> #include <QDeclarativeView> #include <QDeclarativeContext> #include <QDebug> #include "connect.h" #include "mainwindow.h"
cennect::cennect(QObject *parent) : QObject(parent) {
}
void cennect::LoadQml(const bool &v) { m_Tr = new QDeclarativeView; m_Tr->setAttribute(Qt::WA_TranslucentBackground); MainWindow r; m_Tr->rootContext()->setContextProperty("qml", &r); m_Tr->setSource(QUrl::fromLocalFile("main.qml"));
if(v) { m_Tr->show(); } }
void cennect::red() { QApplication::quit(); }
main.qmlimport QtQuick 1.0
Rectangle { width: 360 height: 360 Text { text: qsTr("Hello World") anchors.centerIn: parent } MouseArea { anchors.fill: parent onClicked: { qml.clic(); } } }
Название: Re: при вызове функции С + + с qml, вылетает :(
Отправлено: Patrin Andrey от Ноябрь 07, 2011, 08:16
void cennect::LoadQml(const bool &v) { m_Tr = new QDeclarativeView; m_Tr->setAttribute(Qt::WA_TranslucentBackground); MainWindow r; m_Tr->rootContext()->setContextProperty("qml", &r); m_Tr->setSource(QUrl::fromLocalFile("main.qml"));
if(v) { m_Tr->show(); } }
После выхода из этой функции объект w уничтожится, и следовательно свойство "qml" нельзя трогать из qml файла.
Название: Re: при вызове функции С + + с qml, вылетает :(
Отправлено: red_spider от Ноябрь 07, 2011, 20:29
Patrin Andrey спасибо за помощь но если m_Tr->rootContext()->setContextProperty("qml", &r); изменить на m_Tr->rootContext()->setContextProperty("qml", this); и перенести функцию clic () в этот же класс тогда все работает т.е. если так работает то значит объект w не удаляется или я не совсем правильно понял то что ты написал? мне нужно вызвать функции из другого класса :(
Название: Re: при вызове функции С + + с qml, вылетает :(
Отправлено: Patrin Andrey от Ноябрь 07, 2011, 22:13
Если вы пишите так: m_Tr->rootContext()->setContextProperty("qml", this); то в "qml" находится объект созданный в int main(int argc, char *argv[]) { QApplication a(argc, argv); cennect w; w.LoadQml(true); return a.exec(); } Этот объект живёт до конца работы программы, и обращение к нему не вызывает проблем. По моему вам следует разобраться с временем жизни переменных: когда какие классы создаются, когда уничтожаются, погуглите на эту тему. А ещё во всех своих классах в конструкторы поставьте qDebug() << Q_FUNC_INFO; И напишите для всех классов деструкторы, и в них тоже поставьте qDebug() << Q_FUNC_INFO. Многое должно проясниться.
|