Russian Qt Forum
Ноябрь 22, 2024, 19:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: при вызове функции С + + с qml, вылетает :(  (Прочитано 3130 раз)
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.qml
Код:
import QtQuick 1.0

Rectangle {
    width: 360
    height: 360
    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            qml.clic();
        }
    }
}
Записан
Patrin Andrey
Гость
« Ответ #1 : Ноябрь 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 файла.
Записан
red_spider
Гость
« Ответ #2 : Ноябрь 07, 2011, 20:29 »

Patrin Andrey спасибо за помощь

но если
Код:
m_Tr->rootContext()->setContextProperty("qml", &r);

изменить на

Код:
m_Tr->rootContext()->setContextProperty("qml", this);

и перенести функцию clic () в этот же класс

тогда все работает
т.е. если так работает то значит объект  w не удаляется
или я не совсем правильно понял то что ты написал?

мне нужно вызвать функции из другого класса  Грустный





Записан
Patrin Andrey
Гость
« Ответ #3 : Ноябрь 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. Многое должно проясниться.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 20.