C++ 调用函数时如何使插槽工作?
我有一个功能和插槽和信号之间的连接。 检查以下代码:C++ 调用函数时如何使插槽工作?,c++,qt,C++,Qt,我有一个功能和插槽和信号之间的连接。 检查以下代码: void NetworkAccessManager::sendPOST(QString url) { QNetworkCookieJar *cookieJar = new QNetworkCookieJar(manager_); manager_->setCookieJar(cookieJar); QNetworkRequest request(url); QByteArray postData;
void NetworkAccessManager::sendPOST(QString url)
{
QNetworkCookieJar *cookieJar = new QNetworkCookieJar(manager_);
manager_->setCookieJar(cookieJar);
QNetworkRequest request(url);
QByteArray postData;
postData.append("j_username=admin&");
postData.append("j_password=admin");
manager_->post(request, postData);
connect(manager_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinishedSlot(QNetworkReply *)));
}
void NetworkAccessManager::replyFinishedSlot(QNetworkReply *reply)
{
...
cookie = "...";
}
以上代码归NetworkAccessManager类所有。变量cookie
是公共的,我需要在replyFinishedSlot中更改它的值
我尝试在另一个类的构造函数中使用函数sendPOST()
,它可以工作,但是slot什么也不做,cookie变量为空。我做错了什么
下面是另一个类中的代码:
NetworkAccessManager *manager = new NetworkAccessManager();
manager->sendPOST("http://example.com");
qDebug() << "cookies: " << manager->cookies;
NetworkAccessManager*manager=newnetworkaccessmanager();
经理->发送邮件(“http://example.com");
qDebug()我找到了几个问题解决方案
第一个
我正在将cookie保存到一个文件中。代码如下:
void NetworkAccessManager::replyFinishedSlot(QNetworkReply *reply)
{
...
QFile cookieFile("cookie.txt");
if (cookieFile.open(QIODevice::WriteOnly))
{
cookieFile.write(cookies.toUtf8());
cookieFile.close();
}
...
}
这是我使用函数的类的构造函数
NetworkAccessManager *manager = new NetworkAccessManager();
manager->sendPOST("http://example.com");
QString cookies = "";
QFile cookieFile("cookie.txt");
if (cookieFile.exists() && cookieFile.open(QIODevice::ReadOnly))
{
cookies = cookieFile.readAll();
cookieFile.close();
}
QMap<QString, QString> elements;
elements.insert("cookies", cookies);
.cpp
.qml
请显示sendPOST()
函数的更多代码。它是干什么的?它发送请求了吗?@vahancho是的,它实际上只是发送一个简单的POST请求。我得到了回复Finishedslot。如果整个代码真的能帮助你解决我的问题,我会附加这个问题。代码确实会有用的。在建立连接之前是否发送请求?如果是,它可能会解释问题。@vahancho是的,我会在连接之前发送请求。检查我问题中的代码,我附加了它。尝试两个交换manager\uu->post(…
行与connect(manager\uu…
),即首先将信号连接到插槽,然后发送请求。
class WebViewModel : public QObject
{
Q_OBJECT
public:
explicit WebViewModel(QObject *parent = nullptr);
~WebViewModel();
void sendPOST(QString url);
private slots:
void replyFinishedSlot(QNetworkReply *);
private:
QNetworkAccessManager *manager_;
signals:
void finished(QNetworkReply *);
void cookieReady(QString thisCookie);
};
WebViewModel::WebViewModel(QObject* parent)
: QObject(parent)
{
manager_ = new QNetworkAccessManager(this);
sendPOST("http://example.com");
}
WebViewModel::~WebViewModel()
{
delete manager_;
}
void WebViewModel::sendPOST(QString url)
{
...
connect(manager_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinishedSlot(QNetworkReply *)));
...
}
void WebViewModel::replyFinishedSlot(QNetworkReply *reply)
{
if(reply->error())
{
...
}
else
{
...
QString cookieString = cookie[0].name() + "=" + cookie[0].value() + "; domain=" + cookie[0].domain() + "; path=" + cookie[0].path();
emit cookieReady(cookieString);//the signal sends my variable to .qml
...
}
}
Connections {
target: WebViewModel
onCookieReady: {
testCookies = thisCookie
//thisCookie variable wasn't declared in the .qml file, thisCookie variable
//is accessible by signal void cookieReady(QString thisCookie) from .h C++
//and MUST have exactly the same name in .qml file as in .h file
}
}