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 
    }
}