我已经在网上搜索了此问题,并且反复获得有关的用法的答案QSignalMapper 的用法。但是我的问题很清楚, QSignalMapper 会自动清除最初发出的所有内容,并用代替,再加上通过 setMapping()设置的新数据来代替它。

这里的问题很简单。

我有一个QNetworkAccessManager可以解析html并更新包含文本数据的 vector :

void DataManager::startHttpRequest(QString url, int index)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);

    //QSignalMapper* signalMapper = new QSignalMapper(this);
    //connect(manager,SIGNAL(finished(QNetworkReply*)), signalMapper,SLOT(map()));
    //signalMapper->setMapping(manager, index);
    //connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(insertUpdate(int)));

    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(finishHttpRequest(QNetworkReply*)));
    manager->get(QNetworkRequest(QUrl(url)));
    qDebug() << index;
}

这是正常完成请求后发生的情况:
void DataManager::finishHttpRequest(QNetworkReply *reply)
{
    QString html = QString(reply->readAll()).simplified();
    QString info;
    int start = html.indexOf("<span id=\"SalePrice\" >");
    if(start != -1)
    {
        QString price = html.mid(start + 23, 30);
        int end = price.indexOf("</span>");
        info = price.mid(0, end - 1);
        qWarning() << price.mid(0, end - 1);
    }
    else
    {
        info = "NA";
    }

    // Do more stuff
}

使用正常的信号和时隙方式,我将无法知道我要更新的 vector 的索引

要么,

如果我使用的是 QSignalMapper ,则我知道索引,但不知道其附带的数据。

如何使一起工作(索引+数据)?

(类似mySlot(QNetworkReply *reply, int *index),但我们都知道那是行不通的)

提前谢谢了。

最佳答案

虽然可能不是最好的,

  • sender()->setObjectName(const QString & name)允许发送者自行命名。
  • 可以通过sender()->ObjectName()
  • 从接收槽访问发件人的名称

    http://qt-project.org/doc/qt-5/qobject.html#objectName-prop所记录。

    10-08 08:22
    查看更多