Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача сигнала из C++ в Qt
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Quick
Norad
Всем доброго времени суток! Проблема с передачей сигналов в QML. Читал темы, вроде бы сделал все, как положено. Но начинают лезть ошибки при подключении библиотек, необходимых для работы qmlRegisterType. Код программы представлен ниже.
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QApplication>
#include <QtDeclarative/QDeclarativeView>
#include <QtCore/QUrl>
#include <QDeclarativeContext>
#include "qml_class.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    qml_class *interface;


private slots:
    void on_pushButton_clicked();
    void inslaider(int);

private:
    Ui::MainWindow *ui;
    QDeclarativeView *ua;

signals:
    void slmove(int);

};

#endif // MAINWINDOW_H

qml_class.h
#ifndef QML_CLASS_H
#define QML_CLASS_H

#include <QObject>

class qml_class : public QObject
{
    Q_OBJECT
public:
    qml_class(QObject *parent = 0);

signals:
    void newSignal();

public slots:
    void newSlot();

};

#endif // QML_CLASS_H

main.cpp
#include "mainwindow.h"
#include "qml_class.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow w;
    w.show();
    return app.exec();
}

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHBoxLayout>
#include <QProcess>
[color="#FF0000"]#include <QtQml/QQmlEngine>
#include <QtQuick/QQuickPaintedItem>[/color]
#include "qml_class.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //установка рисунка QML на слой виджета в интерфейсе
    ui->setupUi(this);
    ua = new QDeclarativeView;
    ua->setSource(QUrl("qrc:/main.qml"));
    ua->setResizeMode(QDeclarativeView::SizeRootObjectToView);
    qmlRegisterType<qml_class>("Interface",1,0,"Interface");
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(ua);
    ui->widget->setLayout(layout);
    connect(ui->verticalSlider,SIGNAL(valueChanged(int)),this,SLOT(inslaider(int)));
}

MainWindow::~MainWindow()
{
    delete ui;
    delete ua;
}

void MainWindow::on_pushButton_clicked()
{
    close();
}
void MainWindow::inslaider(int gg)
{

    if (gg>0)
    {
        emit slmove(gg);

    }
}

qml_class.cpp
#include "qml_class.h"

qml_class::qml_class(QObject *parent) :
    QObject(parent)
{

}
void qml_class::newSlot()
{
    emit newSignal();
}

main.qml
import QtQuick 1.1
import Interface 1.0
// расшифровка названий
Item {
    width: 800
    height: 800
    //описание центральной части(окружность)
    Rectangle{
        color: "darkgreen"
        x:120
        y:120
        width: 200
        height: 200
        radius: 100
        //opacity: 0
    }
    // Описание верхнего вертикального плавника
    Rectangle{
        id:rect_rverh
        color: "red"
        x: 224
        y: 20
        width: 1
        height: 100
    }
    Rectangle{
        id: rect_lverh
        color: "red"
        x: 217
        y: 20
        width: 1
        height: 100
    }
    Rectangle{
        color: "#3b7e44"
        anchors.top: rect_rverh.top
        anchors.right: rect_rverh.left
        anchors.left: rect_lverh.right
        height: 100

    }
//    Interface{
//        onNewSignal:
//    }

    // Описание правого горизонтального плавника
    Rectangle{
        id: rect_rhzv
        objectName: "rvert"
        color: "red"
        x: 320
        y: 217//-rv
        width: 100
        height: 1


    }
    Rectangle{
        id: rect_rhzn
        objectName: "rniz"
        color: "red"
        x: 320
        y: 224//+rn
        width: 100
        height: 1
    }
    Rectangle{
    color: "#3b7e44"
    anchors.top: rect_rhzv.bottom
    anchors.bottom: rect_rhzn.top
    anchors.left: rect_rhzv.left
    width: 100
    }
    // Описание левого горизонтального плавника
    Rectangle{

        id: rect_lhzv
        objectName: "lverh"
        color: "red"
        x: 20
        y: 217//-rv
        width: 100
        height: 1
    }
    Rectangle{
        id: rect_lhzn
        objectName: "lniz"
        color: "red"
        x: 20
        y: 224//+rn
        width: 100
        height: 1
    }
    Rectangle{
    color: "#3b7e44"
    anchors.top: rect_lhzv.bottom
    anchors.bottom: rect_lhzn.top
    anchors.left: rect_lhzv.left
    width: 100
    }

    // Описание нижнего вертикального плавника
    Rectangle{
        id:rect_rniz
        color: "red"
        x: 224
        y: 320
        width: 1
        height: 100
    }
    Rectangle{
        id: rect_lniz
        color: "red"
        x: 217
        y: 320
        width: 1
        height: 100
    }
    Rectangle{
        color: "#3b7e44"
        anchors.top: rect_rniz.top
        anchors.right: rect_rniz.left
        anchors.left: rect_lniz.right
        height: 100

    }

Что может быть не так? Заранее спасибо за ответы!)
PS: в программе требуется по сигналу слайдера изменять размер прямоугольников в QML.

Вот, кстати, оповещение об ошибке C:\My_projects\project_test\mainwindow.cpp:-1: ошибка: undefined reference to `_imp___ZN11QQmlPrivate30qdeclarativeelement_destructorEP7QObject'
Iron Bug
я пока вижу, что у тебя ui удаляется до ua, в то время как ua подключен к layout внутри ui. это вряд ли имеет отношение к ошибкам компиляции, но это ошибка программы.

а ошибку компиляции, скорее всего, вызывает невиртуальный деструктор в твоём классе MainWindow.
Norad
Спасибо, поправил. Еще подключил недостающие дериктивы препроцессора(QT += core gui declarative qml quick) в проект, запустил qmake, пересобрал проект. Ошибки подключаемых библиотек исчезли. Но появилась новая проблема. При региcтрации класса через qmlRegisterType<TestClass>("ModuleName", 1, 0, "TypeName");, и подключении этого класса через import "ModuleName" 1.0 в QML файл постоянно вылезает ошибка, что ModuleName is not installed!!! Казалось бы простейшую вещь делаю, но столько проблем возникает...Что делать, пока не сообразил.
Norad
Вот, что пишет: qrc:/main.qml:2:1: module "Modul" is not installed
Trisch
Я в вашем примере не нашел как вы пользуетесь qml_class *interface.

Дело может быть в том, что qmlRegisterType<TestClass>("ModuleName", 1, 0, "TypeName"); создает объект класса TestClass. И чтобы им в последствии воспользоваться надо его как то получить.

Я к примеру, делал так. При инициализации класса TestClass посылается сигнал уведомляющий о его создании. После чего QObject::findChild<TestClass *>() отлавливает сигнал и возвращает объект класса который послал данный сигнал. После чего полученным объектом можно уже пользоваться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.