2014-11-17 14 views
5

Tôi là người mới sử dụng khung Qt. Tôi không chắc mình đang đi sai đâu. Tôi đã thử xem nhiều tài liệu liên quan nhưng vẫn không thể hiểu được.QObject :: kết nối: Không có tín hiệu như vậy trong khi kết nối tín hiệu qml trong C++ Qt 5.3

Tôi nhận được "QObject :: kết nối: Không có lỗi tín hiệu như vậy .." trong khi tôi đã khai báo tín hiệu trong tệp qml.

Đây là mã:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    //QDeclarativeView view; 
    QQmlApplicationEngine engine; 

    testclass dsc; 

    QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///test.qml"))); 
    while(component.isLoading()); 
    if (component.isError()) { 
     qWarning() << component.errors(); 
    } 

    QObject *object = component.create(); 
    QQuickItem *item = qobject_cast<QQuickItem*>(object); 

    QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant))); 
    QObject::connect(&dsc,SIGNAL(dummysignal(QVariant)),&dsc,SLOT(testslot(QVariant))); 
    dsc.dummysignal(&dsc); 
    qDebug("Entered :"); 
    engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); 

    return app.exec(); 
} 

tập tin QML: test.qml

Item { 
    width: 800 
    height: 500 
    signal dsa(var obj) 
    SystemPalette { id: palette } 
} 

class Test: testclass.cpp

#include <QObject> 

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

signals: 
void dummysignal(QVariant); 


public slots: 


void testslot(QVariant); 

}; 

Tôi nhận được lỗi này:

QObject::connect: No such signal test_QMLTYPE_0::dsa(QVariant) in .. 

Trả lời

9

Vấn đề là bạn đang khai báo tham số dsa tín hiệu như một loại 'var', được coi là một giá trị javascript bởi động cơ QML . Vì vậy, điều này được truyền vào C++ dưới dạng QJSValue và chữ ký của tín hiệu bạn đang cố kết nối thực tế là dsa(QJSValue).

Nếu bạn muốn chữ ký để được dsa(QVariant), thay đổi khai tín hiệu của bạn trong test.qml như sau:

// test.qml 

Item { 
    signal dsa(variant obj) 

    width: 800 
    height: 500 

    SystemPalette { id: palette } 
} 

này sẽ cho phép bạn kết nối khi bạn đang cố gắng với tuyên bố

QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant))); 

(Nhưng trước tiên, bạn nên cập nhật chữ ký của vị trí của mình thành void testslot(QVariant); ... nếu không bạn sẽ chỉ gặp vấn đề tương tự ở mặt trái với lỗi 'không có chỗ trống')

FWIW, đây là một thủ thuật hữu ích để gỡ lỗi lỗi 'không có tín hiệu như vậy/khe':

// Assuming you've instantiated QQuickItem* item 
// This will print out the signature for every signal/slot on the object 
// Make sure you include <QMetaObject>, <QMetaMethod> 

const QMetaObject* metaObj = item->metaObject(); 
for (int i = 0; i < metaObj->methodCount(); ++i) { 
    QMetaMethod method = metaObj->method(i); 
    qDebug() << method.methodSignature(); 
} 
+0

Cảm ơn sự giúp đỡ của bạn. Tôi gọi tài liệu này để viết đoạn mã ban đầu từ QT và ở đó họ sử dụng var trong ví dụ thay vì biến thể. http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html – atin

1

Thêm tín hiệu và khe

#include <QObject> 

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

signals: 
    void dsa(QVariant parameter) { 
     //some code 
    } 

public slots: 
    void testslot(QVariant parameter) { 
     //some code here 
    } 

    void testslot(); 
}; 
1

QVariant là loại thích hợp để sử dụng trong Qt 5.2 để lập bản đồ var thông số tín hiệu, nhưng nó đã được thay đổi trong Qt 5.3 để ánh xạ QJSValue thay vì: Change C++ parameter type used for var parameters in QML declared signals

Mặc dù, điều này đã được hoàn nguyên trong Qt 5.4, mà sẽ sử dụng QVariant một lần nữa cho var thông số tín hiệu: Revert mapping of var signal parameters to QJSValue

+0

ohh okay cảm ơn những thay đổi này gây ra sự tàn phá cho các nhà phát triển mới phá vỡ đầu của họ tại sao công cụ không hoạt động :-) – atin

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