2013-01-23 83 views
1

我有一個QT快速項目,我試圖從QML發出一個信號,並連接到C++插槽。QML信號到C + +插槽qt4.8

QML文件

import QtQuick 1.0 
//import com.net 1.0 

Column { 
id: mainCol 
x: 20; y: 80 
width: 320 
//height: 62 
opacity: 0 

//NetCom{ id: netcom} 


Rectangle{ 
    signal tcpMsg(string address, int port) 
    objectName: "topRec" 
    id: topRec 
    width: 40; height: 40 
    color: "blue" 
    Text{ 
     text: "send tcp msg"; font.pointSize: 14 
     anchors.verticalCenter: topRec.verticalCenter 
     anchors.left: topRec.right 
     anchors.rightMargin: 10 
    } 
    Text{ 
     id: statusTxt 
     //text: cppInterface.qml_text ; font.pointSize: 12 
     text: "status: "; font.pointSize: 12 
     anchors.horizontalCenter: topRec.horizontalCenter 
     anchors.top: topRec.bottom 
     anchors.bottomMargin: 10 
    } 

    MouseArea { 
     id: mouseArea 
     transformOrigin: Item.Center 
     anchors.fill: parent //anchor all sides of the mouse area to the rectangle's anchors 
     onClicked: { 
      topRec.tcpMsg("127.0.0.1", 8888) 
      console.log("clicked") 
     } 
    } 
} 


states:[ 
    State { 
     name: "visible"; 
     PropertyChanges { target:mainCol; opacity: 1;} 
    } 
] 

transitions:[ 
    Transition { 
     from:""; to: "visible"; reversible: true 
     NumberAnimation { properties: "opacity"; duration: 500; easing.type: Easing.InOutQuad } 
    } 
] 

} 

C++文件

#include <QtGui/QApplication> 
#include <QtDeclarative> 

#include "qmlcppmediator.h" 
#include "qmlapplicationviewer.h" 
#include "kernelcom.h" 
#include "netcom.h" 


Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
QScopedPointer<QApplication> app(createApplication(argc, argv)); 
//needed to use C++ code in QML 
qmlRegisterType<KernelCom>("com.kernel", 1, 0, "KernelCom"); 
qmlRegisterType<NetCom>("com.net", 1, 0, "NetCom"); 


QmlApplicationViewer viewer; 
viewer.setWindowFlags(Qt::FramelessWindowHint); 
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
viewer.setMainQmlFile(QLatin1String("qml/testMenu/main.qml")); 

//make signal from Qml file trigger slots in C++ 
QDeclarativeView view; 
view.setSource(QUrl::fromLocalFile("qml/testMenu/TCPmenu.qml")); 
QObject *object = view.rootObject(); 
QObject *child = object->findChild<QObject*>("topRec"); 

qDebug()<<child; 
NetCom client; 

qDebug()<<QObject::connect(child,SIGNAL(tcpMsg(QString, quint16)), &client, SLOT(start(QString, quint16))); 


viewer.showExpanded(); 

return app->exec(); 
} 

我不斷收到以下錯誤消息

QDeclarativeRectangle_QML_3(0x99c5998, name = "topRec") 
Object::connect: No such signal QDeclarativeRectangle_QML_3::tcpMsg   (QString, quint16) 
Object::connect: (sender name: 'topRec') 
false 

我一直在使用QDecarativeEngine嘗試,將信號在主QML項目所以我沒有使用得到孩子,我不斷收到上面的消息。

感謝

回答

1

就想通了,這難道不連接,因爲我是用qunit16數據類型,而不是在 使用INT我改了行這

connect(child,SIGNAL(tcpMsg(QString, int)), &client, SLOT(start(QString, int))) 

,然後將其連接。

另外我並不需要QDeclarativeView我支持從QmlApplicationViewer查看器設置rootObject;