- 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。
------解决方案--------------------
自定义一个信号就行了