crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Передача сигнала из C++ в Qt, При подключении библиотек вылезает куча ошибок
Norad
  опции профиля:
сообщение 10.7.2014, 10:08
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 10.7.2014
Пользователь №: 4183

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброго времени суток! Проблема с передачей сигналов в 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
  опции профиля:
сообщение 10.7.2014, 12:12
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


я пока вижу, что у тебя ui удаляется до ua, в то время как ua подключен к layout внутри ui. это вряд ли имеет отношение к ошибкам компиляции, но это ошибка программы.

а ошибку компиляции, скорее всего, вызывает невиртуальный деструктор в твоём классе MainWindow.

Сообщение отредактировал Iron Bug - 10.7.2014, 12:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norad
  опции профиля:
сообщение 11.7.2014, 7:36
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 10.7.2014
Пользователь №: 4183

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, поправил. Еще подключил недостающие дериктивы препроцессора(QT += core gui declarative qml quick) в проект, запустил qmake, пересобрал проект. Ошибки подключаемых библиотек исчезли. Но появилась новая проблема. При региcтрации класса через qmlRegisterType<TestClass>("ModuleName", 1, 0, "TypeName");, и подключении этого класса через import "ModuleName" 1.0 в QML файл постоянно вылезает ошибка, что ModuleName is not installed!!! Казалось бы простейшую вещь делаю, но столько проблем возникает...Что делать, пока не сообразил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norad
  опции профиля:
сообщение 11.7.2014, 9:03
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 10.7.2014
Пользователь №: 4183

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот, что пишет: qrc:/main.qml:2:1: module "Modul" is not installed
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 12.7.2014, 14:42
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Я в вашем примере не нашел как вы пользуетесь qml_class *interface.

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

Я к примеру, делал так. При инициализации класса TestClass посылается сигнал уведомляющий о его создании. После чего QObject::findChild<TestClass *>() отлавливает сигнал и возвращает объект класса который послал данный сигнал. После чего полученным объектом можно уже пользоваться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 1:57