使用 qml 从 qt5 发布 HTTP 请求

Posted

技术标签:

【中文标题】使用 qml 从 qt5 发布 HTTP 请求【英文标题】:Post HTTP request from qt5 using qml 【发布时间】:2013-12-29 13:03:35 【问题描述】:

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

这是我的 qml 代码 sn-p:

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 文件中具有与标题相对应的定义。

【问题讨论】:

“但不知何故我无法让它工作”->您到底面临什么错误?顺便说一句,你能修复格式吗? u_name 和 p_text 是什么? 它是说...TypeError: 对象 esQuickSettings(0x2a046a0) 的属性 'esLogin' 不是函数.. 我知道为什么这是错误的,因为 esLogin 不是我在头文件中定义的属性...我已将其定义为 Slot....但使用 slot 我不知道如何连接此插槽带有我在 qml 中创建的信号 不能用普通的QObject::connect(object, SIGNAL(esLoginClicked(const QString&, const QString&)), &foo, SLOT(esLogin(const QString&, const QString&)));吗? 只是想明白...我会在我的头文件中声明这个连接并在我的cpp文件中定义esLogin()方法,但是我的QML中的数据会传递给这个方法.. 【参考方案1】:

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

将 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()信号处理程序。

【讨论】:

感谢您解释的答案,我设法理解了这两种方法,但连接失败错误(空)但我希望我能解决它..如果不是会问..谢谢...跨度> 嗨,Laszlo,当我使用 setContextProperty 在 QML 中公开声明的插槽时,它会抛出此错误“重新定义 'struct qmetatypeid”,现在似乎使用您的方法给出相同的错误上面解释过......知道我错过了什么......似乎是一些链接错误\ 究竟如何公开上下文属性? QDeclarativeView 视图; NetworkInfo myClass; view.rootContext()->setContextProperty("myObject", &myClass); view.setSource(QUrl::fromLocalFile("qml/esQuick/esQuickPageLogin.qml"));现在使用 myObject 访问我的插槽 @Jeet: 404: 找不到页面 - 页面 goo.gl/t44IhF%22 不存在。我想你的意思是pastebin.kde.org/pd4ikf3wr。不要在 url 中使用引号。 ;) 交换 36 和 38。

以上是关于使用 qml 从 qt5 发布 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

Qt5。在 QML 中嵌入 QWidget 对象

从 C++ (Qt5) 向 QML 项目发送信号

Qt SSL:从 QML 发出的请求握手失败

QT - WebSockets

Qt5 / PyQt5 : 带有 QML 前端和 Python 后端的自定义 QML 组件

Qt5 和 QML:如何使用 WebEngine Quick Nano Browser 自动输入用户名和密码