2016-10-07 9 views
3

私は苦しい問題を抱えています。私は助けが必要です。なぜなら、私はすでに何も考えていないからです。qmlにC++クラスオブジェクトを作成できません "リストプロパティにオブジェクトを割り当てることができません"データ "

ここにあります。 Qt Creator for Windows 8.1でqmlを使ってqtクイックアプリケーションを書いています。名前が "one"の私自身のC++クラスを作成しました。経由でRegistrated:QMLファイルで

私はそれをインポート:

import OneClass 1.0 

今ではすべてでは非常によく働きました。しかし、私は共有ライブラリを作成することに決めました。ここで私は "One" C++クラスを作成しました。新規プロジェクト→ライブラリ→C++ライブラリとして別々のプロジェクトを作成しました。 "mainlib"という名前のライブラリを構築しました。 .PROファイル内の文字列を追加することにより、自分のアプリケーションにこのライブラリ接続:

DEPENDPATH += ../lib/mainlib 
INCLUDEPATH += ../lib/mainlib 
LIBS += -L../lib/build-mainlib-Desktop_Qt_5_7_0_MinGW_32bit-Release/release -lmainlib 

実行プロジェクトを、私はこの問題を持っているときには、瞬間だ:私の「one.h」ファイルの

QQmlApplicationEngine failed to load component

qrc:/main.qml:18 Cannot assign object to list property "data"

ASSERT: "!isEmpty()" in file C:\Program >Files\Qt\5.7\mingw53_32\include/QtCore/qlist.h, line 341

ピース:

#ifndef ONE_H 
#define ONE_H 

#include "mainlib_global.h" 
#include <QObject> 

class MAINLIBSHARED_EXPORT One : public QObject 
{ 
    Q_OBJECT 

    Q_PROPERTY(QString port_number READ get_port_number WRITE set_port_number) 
    Q_PROPERTY(QString port_speed READ get_port_speed WRITE set_port_speed) 
    Q_PROPERTY(QString x READ get_x WRITE set_x) 
    Q_PROPERTY(QString y READ get_y WRITE set_y) 

public: 
    One(); 
    ~One(); 

    QString get_port_number(void); 
    ... 

signals: 
    void portOpened(QString str); 
    ... 

private: 
    QString port_number; 
    QString x; 
    QString y; 
}; 

#endif // ONE_H 

"mainlib_global.h":

#ifndef MAINLIB_GLOBAL_H 
#define MAINLIB_GLOBAL_H 

#include <QtCore/qglobal.h> 

#if defined(MAINLIB_LIBRARY) 
# define MAINLIBSHARED_EXPORT Q_DECL_EXPORT 
#else 
# define MAINLIBSHARED_EXPORT Q_DECL_IMPORT 
#endif 

#endif // MAINLIB_GLOBAL_H 

"mainlib.pro":私は一つのクラスの私のオブジェクトを宣言した私の "main.qml" ファイルの

QT  -= gui 

TARGET = mainlib 
TEMPLATE = lib 

DEFINES += MAINLIB_LIBRARY 

SOURCES += one.cpp 

HEADERS += one.h\ 
     mainlib_global.h 

unix { 
    target.path = /usr/lib 
    INSTALLS += target 
} 

はワンピース、:私の "main.cppに" ファイルの

import QtQuick 2.5 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.4 
import QtQuick.Controls.Styles 1.0 
import OneClass 1.0 
import QtQuick.Dialogs 1.1 

Window { 
    id: mainWindow 
    visible: true 
    width: 1000 
    height: 720 
    minimumWidth: 930 
    color: "lightgrey"; 
    property bool connected: false 

    // Object declaration 
    One {id: objOne} 
    ... 
    } 

ワンピース:

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QtSerialPort/QSerialPortInfo> 
#include <QDebug> 
#include "one.h" 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QLocale::setDefault(QLocale::c()); 
    qmlRegisterType<One>("OneClass", 1, 0, "One"); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
    ... 
    return app.exec(); 
} 

私のアプリケーションの.PROファイル:

TEMPLATE = app 

DEPENDPATH += ../lib/mainlib 
INCLUDEPATH += ../lib/mainlib 
LIBS += -L../lib/build-mainlib-Desktop_Qt_5_7_0_MinGW_32bit-Release/release -lmainlib 

QT += qml quick serialport 
CONFIG += c++11 

win32: RC_ICONS += icon.ico 

SOURCES += main.cpp \ 
    #one.cpp 

RESOURCES += qml.qrc 

# Additional import path used to resolve QML modules in Qt Creator's code model 
QML_IMPORT_PATH = 

# Default rules for deployment. 
include(deployment.pri) 

HEADERS += \ 
    #one.h 

"one.h"と "one.cpp"のコメントを外してアプリケーションと一緒にコンパイルすると、この問題は現れず、すべて正常に動作します。しかし、ライブラリと一緒に作業することをコメントするとき、私はこの問題を "プロパティをリストするオブジェクトを割り当てることができません"というデータ問題を取得します。

私はプロジェクト - >ライブラリの追加を右クリックしてライブラリに接続しようとしましたが、結果は同じです。私はこの "data"プロパティに関するドキュメントを読んで、明示的にオブジェクト宣言を "data"に割り当てようとしましたが、同じことをしました。試しました:

resources: [ 
    One {id: objOne} 
] 

「オブジェクトをリストプロパティに割り当てることができません」というリソースがあります。私はこの問題を解決するだけで疲れました。私はあなたがたぶんすべてのステップを説明しました。私は間違ったやり方で何かをするかもしれないと思いますから?私は可能な解決策は、新しいプロパティを宣言し、新しい「ワン」コンポーネントにバインドすることです...助けを

+0

'one.h'の内容は何ですか? –

+0

@Patrizio、私は 'one.h'の内容を私の投稿に追加しました。 –

+0

「One」とは何か、そして「リソース」とは何かを推測するでしょうか? – folibis

答えて

1

物乞いをしています:

Window { 
    property One objOne: One { } 
} 

しかしあなたはこれが引き起こす可能性が見るように他の(スレッド)問題。しないでください!

は、Qtビルトインプラグインの使用をお勧めします。それはあなたが望むものを正確に行うように設計されています:外部の動的QMLライブラリのインポート。 文書を確認してください:http://doc.qt.io/qt-5/qtqml-modules-cppplugins.html

+0

ありがとう、それを念頭に置くでしょう。しかし、私の変種がなぜ機能しないのか分かりません。私は、ライブラリを使うことは、クラスと一緒にプロジェクトをコンパイルするのと同じだと思います。何も変わりません。共有ライブラリに関するドキュメントもあります:http://doc.qt.io/qt-4.8/sharedlibrary.html。 さらにwiki:https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application。問題ではないはずです。 –

+0

静的ライブラリを使用することは、クラスと並行してコンパイルすることと同じです。動的ライブラリは少し異なります。本当に動的qmlライブラリが必要な場合は、docに記述されているように作成してください。これにより、両方のプロジェクト間の依存関係も軽減されます。 – MrBlueSky

+0

プラグインとしてやり直してください。リリースモードではすべてうまく動作しますが、デバッグでは 'プラグインをモジュールにロードできません 'というエラーが表示されます。リリースからdebug dir pluginフォルダに入れてください。しかし、それは動作しません。私はプラグインが普通のライブラリとしてコンパイルされていることを理解しているので、qmlでなくても他のプロジェクトでも使用できますか?差異はプラグインとして接続されていることだけですか? –

関連する問題