Qt将附加参数传递给插槽并保持发出的信号数据

时间:2014-04-24 23:45:25

标签: c++ qt networking web qt5

我在网上搜索了这个问题,并且我反复提到了使用 QSignalMapper 的答案。但我的问题非常明确, QSignalMapper 会自动删除最初发出的内容,并以 nothing 替换它,加上通过 setMapping()设置的新数据。

这里的问题很简单。

我有一个QNetworkAccessManager,它解析html并更新包含文本数据的向量:

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
}

使用正常的信号和插槽方式,我无法知道我正在更新的矢量的索引

或者,

如果我使用 QSignalMapper ,我 知道 索引,但不知道随附的数据。

如何 BOTH 工作(索引+数据)?

(类似于mySlot(QNetworkReply *reply, int *index),但我们都知道这不起作用)

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

虽然它可能不是最好的,

  • sender()->setObjectName(const QString & name)允许发件人为自己命名。

  • 可以通过sender()->ObjectName()

  • 从接收位置访问发件人的姓名

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