大家好, 我正在尝试从我的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);
但不知何故,我无法让它工作,并且在这里错过了一些关键概念来使信号和插槽工作。
PS:我想从 QML 获取输入并放入插槽中,该插槽将在 cpp 文件中具有与标头对应的定义。
(至少)有两种方法可以解决这个问题,但我只会根据评论讨论让您知道其中一种。
将 QML 信号连接到C++插槽。
主.qml
...
Button {
id: signInButton
// This is necessary for finding this nested item in C++
objectName: "SignInButtonObjectName"
...
}
...
主.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()。