使用qml到c ++的参数传递信号

时间:2013-01-09 06:08:04

标签: qt qml

我不知道如何在Qt中将参数从QML文件传递到c ++文件。

QML代码:

import QtQuick 1.1

Rectangle{
    id:loin
    height: 272
    width:480
    property alias loguid:loginuid
    signal sigHome()
    Rectangle{
        id:rect1
        width:parent.width-80
        height:24
        TextInput {
            id:loginuid
            maximumLength: 16
            width: maximumLength * 20
            focus: false
            validator: RegExpValidator { regExp: /\d+/ }
            KeyNavigation.down: login1
        }
    }
    Button{
        id: login1
        x: 195
        y: 187
        height:30;
        focus:false
        border.color:"black"
        opacity: activeFocus ? 1.0 : 0.5
        Text{
        text:"LOGIN"
            anchors.horizontalCenter:login1.horizontalCenter;
            anchors.verticalCenter:login1.verticalCenter;
        }
        Keys.onReturnPressed: {
             if(loginuid.text  <  1000000000000000)
             {
                 text1.opacity=0.1
                 error1.visible=true
                 errorText.text="\n enter valid 16 digit number\n"
                 errorOk.focus=true
                 loginuid.focus=false
             }
             else{
                 loginuid.focus=false
                 loin.sigHome()
             }
        }
    }
}

c ++代码:

#include <QApplication>
#include <QDeclarativeView>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    int uid;
    QDeclarativeView view;
    view.setSource(QUrl::fromLocalFile("main.qml"));
    view.show();
    return app.exec();
}

当我按下登录按钮时,rect1.text内容shud转到main.cpp文件和main.cpp中的uid获取dat值。像uid=rect1.text这样的东西 怎么做?

3 个答案:

答案 0 :(得分:4)

谢谢,塞巴斯戈,你的回复帮助了我。我用信号和插槽进行通信。 我在main.qml中创建了一个信号。

signal info(string msg)

并在登录页面

else{
    info(loginUid.text)
    loginuid.focus=false
    loin.sigHome()
} 

在main.cpp中我把它连接到d槽 main.cpp就像这样

#include <QtGui>
#include <QApplication>
#include <QDeclarativeView>
#include <QtDeclarative>

class DeclarativeView : public QDeclarativeView
{
    Q_OBJECT
    public:
        DeclarativeView(const QUrl & source) : QDeclarativeView(source)
        {
        }
    public slots:
        void readText(QString quid)
        {
            qdebug<<quid;
        }           
};
#include "main.moc"
int main(int argc, char *argv[])
{
    QString file = "main.qml";

    QApplication app(argc, argv);
    DeclarativeView view(QUrl::fromLocalFile(file));
    QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(view.rootObject());
    QObject::connect(item, SIGNAL(info(QString)), &view, SLOT(readText(QString)));
    view.show();
    return app.exec();
}

答案 1 :(得分:3)

我不会尝试从C ++端听取QML信号。使用参数调用C ++方法要容易得多,并且实现相同:

要做到这一点,你必须:

  • 定义接受所需参数的slotinvokable方法
  • register带有声明引擎的方法的类
  • 然后您可以set此类的实例作为root context的属性,最后从QML调用此方法

official documentation

也详细介绍了这个主题

答案 2 :(得分:1)

创建GUI控制器C ++类:

class UiController : public QObject
{
   Q_OBJECT

public:
   UiController();
   virtual ~UiController();

public slots:
   void cal_daysoff__onDoubleClicked(const QDate& date);
};

在QML文件中,您可以定义一个日历控件,在该日历控件中将信号连接到控制器中的插槽:

Calendar{
   id: cal_daysoff
   Layout.fillWidth: true
   Layout.fillHeight: true
   onDoubleClicked: UiController.cal_daysoff__onDoubleClicked(date)
}

在主文件中,启动QML界面时,将接口连接到控制器:

#include "uicontroller.h"

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

   UiController control;
   engine.rootContext()->setContextProperty("UiController", &control);

   engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

   return app.exec();
}