使用qml从qt5发布HTTP请求

时间:2013-12-29 13:03:36

标签: c++ qt qml qt5 qtquick2

大家好,            我正在尝试从我的qt应用程序发送http post请求。我已经阅读了很多,仍然在努力获得一些信号和插槽的概念。如果有人能从这里帮助我,那会很好..

这是我的qml代码段:

TextField { id: u_name; placeholderText: userText(); Layout.fillWidth: true; style: StyleTextField {} }
                TextField { id: p_text;   echoMode: TextInput.Password;  Layout.fillWidth: true; style: StyleTextField {} }
                Button {
                    id: signInButton
                    text: "Sign In";
                    style: StyleButton {}
                    Layout.fillWidth: true;
                    //Layout.alignment: Qt.AlignTop;
                    signal esLoginClicked()
                    onClicked: {
                        if (u_name.text.length)  Settings.userText =  u_name.text;
                        if (p_text.text.length)  Settings.passText  = p_text.text;
                      signInButton.esLoginClicked().connect(esLogin(u_name.text,       p_text.text));
                        page_stack.pop();
                    }
                }

这里我试图从用户那里获取用户名和密码,并希望将它传递给我在头文件中使用我在这里创建的信号esLoginCLicked()声明的插槽“esLogin”。我的头文件看起来像这样......

Q_OBJECT
Q_PROPERTY(QString userText  READ userText  WRITE setUserText NOTIFY userTextChanged)
Q_PROPERTY(QString passText  READ passText  WRITE setPassText NOTIFY passTextChanged)

 public:
 static esQuickSettings *instance(void);

 public:
 QString userText(void);
 QString passText(void);
// void esLoginClicked(void);
// void esLoginClicked(const QString& userText, const QString passText);

 public:
 void setUserText(const QString& user);
 void setPassText(const QString& passt);
 void esLogin(const QString& userText, const QString& passText);
  signals:
 void userTextChanged(void);
 void passTextChanged(void);

但不知何故,我无法使其工作,并且缺少一些关键概念,以使信号和插槽工作。

P.S:我想从QML中获取输入并放入插槽,该插槽将在cpp文件中定义与标题相对应的内容。

1 个答案:

答案 0 :(得分:0)

有(至少)两种方法可以解决这个问题,但我只会根据评论讨论让您了解其中一种方法。

将QML信号连接到C ++插槽。

main.qml

...
Button {
    id: signInButton
    // This is necessary for finding this nested item in C++
    objectName: "SignInButtonObjectName"
    ...
}
...

的main.cpp

...
QQmlEngine engine;
QQmlComponent component(&engine, "main.qml");
QObject *object = component.create();
QObject *childObject = object->findChild<QObject*>("SignInButtonObjectName");
Foo foo;
QObject::connect(childObject, SIGNAL(esLoginClicked(const QString&, const QString&)), &foo, SLOT(esLogin(const QString&, const QString&)));
...

另一种方法是在发出信号时调用qml代码中的C ++插槽,这可能更简单。在这种情况下,您可以使下面的方法Q_INVOKABLE甚至更好:一个插槽。

void esLogin(const QString& userText, const QString& passText);

然后,您需要确保此方法通过上下文属性向qml公开,即:您将使该类成为一个上下文属性,可用于qml,以便在所需的qml中调用foo.esLogin()信号处理程序。