Приветствую. Возникли некоторые проблемы с организацией слотов.
Моя задача:
Имеется QTableWidget наполненный данными. Я должен:
- в цикле считать каждую строчку по отдельности
- используя строчку сформировать ссылку
- Далее получить html страницу
- выдернуть оттуда данные
- и вписать их в соседний column (соседний к текущей взятой строчке)
Не было бы проблем, если бы я использовал только один метод получения данных. В этом случае я бы просто использовал:
connect(reply, SIGNAL(finished()),
this, SLOT(httpFinished()));
Но мне нужно получить несколько страниц с использованием данной строки и выдернуть из них несколько данных.
Ну допустим вот так всё это будет:
void MainWindow::start() {
for (int i=0; i < table->rowCount(); ++i) {
//Тут я беру table->item(i, 0)->text() и должен получить страницы
//Далее я должен их распарсить и получить свои данные
//Далее присваиваю распарсенные данные соседнему столбцу
QTableWidgetItem *newItem = new QTableWidgetItem(); //Новое значение
table->setItem(i, 1, newItem);
QTableWidgetItem *newItem1 = new QTableWidgetItem(); //Новое значение2
table->setItem(i, 1, newItem1);
}
}
Как лучше всё это организовать? Если использовать обычный метод, то данные я смогу получить в слоте httpFinished(), а мне они нужны в цикле, чтобы присвоить нужному столбцу полученные значения.
У меня есть пара вариантов:
1. Использовать функции извлечения параметров из страниц как слоты завершения запроса для QNetworkReply.
Например:
//Тут я формирую запрос
connect(reply, SIGNAL(finished()),
this, SLOT(GetMyFirstValue()));
//Тут я формирую второй запрос
connect(reply, SIGNAL(finished()),
this, SLOT(GetMySecondValue()));
Как только запрос закончиться - я получу исходник страницы в слоте GetMy
NValue() тут я спарсю нужные данные. Но теперь тупик: я не знаю в какую строчку таблицы нужно вставить данные.
Может использовать для этих целей глобальную переменную, которая будет одновременно счетчиком цикла и числом текущей позиции, чтобы я смог в слоте вставить данные в нужную строку?
И еще я хотел бы вынести всю рутину по работе с сетью в отдельный класс (чтобы отделить работу с ГУИ от работы с сетью). Тогда вариант с глоб. переменной отпадает? Или всё таки обращаться к этой переменной из другого класса? (имхо вариант не очень).
2. Вариант с QEventLoop (начинать его до начала запроса и связать конец запроса с завершением QEventLoop). Проблем заметно убавляется (избавляюсь от перехода в другой слот после завершения запроса). Но как я понимаю, такой вариант не очень правильный и красивый.
Еще заметил интересный метод isFinished у QNetworkReply...
Заранее благодарен за помощь.