当前位置: 代码迷 >> QT开发 >> 当signal and slot需要传送额外参数的时候该怎么处理呢
  详细解决方案

当signal and slot需要传送额外参数的时候该怎么处理呢

热度:53   发布时间:2016-04-25 04:32:18.0
当signal and slot需要传送额外参数的时候该怎么办呢?
C/C++ code
void MainWindow::update_data(QStringList const &data){    int const size = data.size();    for(int i = 0; i != size; ++i)    {        QNetworkReply *reply = theme_get_->request_html(data[i]);        connect(reply, SIGNAL(finished()), this, SLOT(update_message_number()));    }}void MainWindow::update_message_number(){    auto result = theme_get_->read_html(qobject_cast<QNetworkReply *>(sender()) );    if(!result.first) qDebug() << result.second;    int const number = parser_.get_anime_live_message_number(result.second);    anime_live_model_->set_current_message_number(/*index of the row*/, number);}

我需要多传一笔参数(int),可是Qt signal and slot是base on text的,不可能直接把参数绑进去
我试过QSignalMapper,可是他无法得到另外一笔参数--reply
我尝试把资料存在map中,可是此解法相当丑陋

C/C++ code
void MainWindow::update_data(QStringList const &data){    int const size = data.size();    for(int i = 0; i != size; ++i)    {        QNetworkReply *reply = theme_get_->request_html(data[i]);                connect(reply, SIGNAL(finished()), this, SLOT(update_message_number()));        mapper.insert(std::make_pair(reply, i) );     }}void MainWindow::update_message_number(){    auto result = theme_get_->read_html(qobject_cast<QNetworkReply *>(sender()) );    if(!result.first) qDebug() << result.second;    int const number = parser_.get_anime_live_message_number(result.second);    if(mapper.find(sender()) != mapper.end() )      anime_live_model_->set_current_message_number(mapper[sender()], number);    else      QTimer::single_shot(500, this, SLOT(update_message_number(number ) ) ); //如果map没有更新,会重复呼叫}


请问有没有其他办法可以解决这个问题?

真希望Qt5快点出来,Qt5的signal and slot机制改了不少

------解决方案--------------------
因为finished() 是Qt 框架自己的信号,你是不可以修改的。而且,slot的参数个数是不可以 多于 相应的signal的。
这里有一个解决的办法就是 用连接 finished() 信号,到另一个 中转的slot中,添加了参数在 相应的 连接你需要的slot。
或者是,你可以自己创建你的finished(int) signal。
------解决方案--------------------
自定义一个信号就行了
  相关解决方案