2012-12-11 40 views
8

Vì vậy, tôi đã thực hiện một số tìm kiếm và không có câu hỏi tương tự nào mà tôi đã đọc có lời khuyên hoạt động.Gọi phương thức C++ từ QML (Qt Quick application)

Tôi đang sử dụng Trình tạo Qt (và tôi không quá quen thuộc với Qt) nên tôi không chắc chắn về voodoo được thực hiện trong nền. Tuy nhiên, tôi đang sử dụng một dự án ứng dụng nhanh Qt tiêu chuẩn.

Về cơ bản, tôi muốn gọi hàm C++ từ QML trả về một chuỗi thay thế một số văn bản trong bố cục, định kỳ.

Đây là main.cpp:

#include <QtGui/QApplication> 
#include "qmlapplicationviewer.h" 
#include <QDeclarativeContext> 


class testClass : public QObject 
{ 
    Q_OBJECT 
public: 
    Q_INVOKABLE QString gimmeText() { 
      return QString("new text"); 
} 
}; 



Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 

    QmlApplicationViewer viewer; 

    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml")); 

    testClass t; 
    viewer.rootContext()->setContextProperty("testOb", &t); 

    viewer.showFullScreen(); 

    return app->exec(); 
} 

Và đây là một đoạn của cách bố trí (như hầu hết của nó là rõ ràng là không thích hợp):

Text { 
    id: text1 
    x: 105 
    y: 156 
    color: "#ffffff" 
    text: qsTr("text") 
    font.pixelSize: 12 
    Timer { 
     interval: 1000; running: true; repeat: false 
     onTriggered: text1.text = testOb.gimmeText(); 
    } 

Các lỗi đưa ra là:

invalid use of incomplete type 'struct QDeclarativeContext' main.cpp (28) 
forward declaration of 'struct QDeclarativeContext' qdeclarativeview.h (60) 

CHỈNH SỬA: với QDeclarativeContext được bao gồm, phần trên biến mất, đưa ra các lỗi sau:

(.text.startup+0x3e):-1: error: undefined reference to `vtable for testClass' 
(.text.startup+0xcf):-1: error: undefined reference to `vtable for testClass' 
(.text.startup+0x12b):-1: error: undefined reference to `vtable for testClass' 
:-1: error: collect2: ld returned 1 exit status 

Tôi chưa thực hiện nhiều chương trình C++, vì vậy tôi không hoàn toàn quen thuộc với ý nghĩa của nó. Lời khuyên sau đây cho các vấn đề cơ bản giống hệt nhau chỉ cho tôi lỗi vtable hoặc nhiều thứ khó hiểu hơn. Điều này thực sự gây nhầm lẫn cho tôi là, nhìn vào tập tin tiêu đề, QmlApplicationViewer có nguồn gốc từ QDeclarativeView, đó là chính xác những gì các tài liệu Qt sử dụng here để làm gần như chính xác những gì tôi muốn. Cảm ơn bạn đã đề xuất bất kỳ ai.

+0

Các thông báo lỗi có nghĩa, rằng trình biên dịch biết, rằng có một lớp được gọi là "QDeclarativeContext" nhưng không biết chi tiết cần thiết để giải quyết một cuộc gọi chức năng (ví dụ). Tra cứu tiêu đề mà lớp đó được khai báo và bao gồm tiêu đề đó trong ví dụ của bạn. –

+0

Đó là những gì tôi đã đọc. Vì vậy, tôi đã bao gồm nó. Nó chỉ cung cấp cho tôi ba tham số 'undefined reference to 'vtable cho testClass'. – Logan

+0

Bạn có chắc chắn rằng bạn đang liên kết chính xác với các thư viện qt và các thư viện được đưa ra theo thứ tự đúng không? –

Trả lời

0

Tôi không có kinh nghiệm với qt và tôi không thể thấy nội dung trong mã kích hoạt lỗi. Tuy nhiên khi các lỗi như vậy xảy ra, đó là vì lớp (struct QDeclarativeContext) đã được chuyển tiếp khai báo, nhưng là được sử dụng như toàn bộ định nghĩa được gọi là (thành viên truy cập, khai báo biến kiểu này, v.v.). Để khắc phục điều này, bạn cần phải bao gồm tiêu đề có định nghĩa loại này.

+0

câu hỏi được cập nhật. điều này có thể khắc phục các lỗi đó, nhưng phát sinh nhiều hơn. – Logan

5

Bạn phải đăng ký lớp học của mình để sử dụng nó với QML. Bạn có thể làm điều này trong chức năng chính. Bạn cũng phải nhập nó trong mã QML. Mã của bạn sẽ trông như thế này:

main.cpp:

#include <QtGui/QApplication> 
#include "qmlapplicationviewer.h" 
#include <QDeclarativeContext> 

#include <QtDeclarative> // Required for registration 


class testClass : public QObject 
{ 
    Q_OBJECT 
    public: 
    Q_INVOKABLE QString gimmeText() { 
      return QString("new text"); 
    } 
}; 



Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 

    qmlRegisterType<testClass>("MyCustomQMLObjects", 2, 35, "testClassNameInQML"); 

    QmlApplicationViewer viewer; 

    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml")); 

    testClass t; 
    viewer.rootContext()->setContextProperty("testOb", &t); 

    viewer.showFullScreen(); 

    return app->exec(); 
} 

QML mã:

// ... 

import MyCustomQMLObjects 2.35 

// ... 

property testClassNameInQML testOb 

// ... 

Text { 
    id: text1 
    x: 105 
    y: 156 
    color: "#ffffff" 
    text: qsTr("text") 
    font.pixelSize: 12 
    Timer { 
     interval: 1000; running: true; repeat: false 
     onTriggered: text1.text = testOb.gimmeText(); 
    } 

// ... 
Các vấn đề liên quan