это мой код
QList<QString> IPs; //IP address
...
connect(this, SIGNAL(addItems(QTreeWidgetItem*)), this,
SLOT(addNewItemToTree(QTreeWidgetItem*)));
void MainWindow::startPing()
{
for (int i = ipStart; i <= ipEnd; i++)
{
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0, IPs.at(i));
if (PingHost(IPs.at(i)))
{
item->setText(1, "online");
}
else
{
item->setText(1, "offline");
}
emit addItems(item);
}
}
void MainWindow::addNewItemToTree(QTreeWidgetItem *item)
{
items.append(item);
ui->treeWidget->addTopLevelItem(item);
}
PingHost
это функция, время выполнения может быть более 2 секунд.
Я скомпилировал и запустил эту программу без каких-либо ошибок или предупреждений.
Я думаю item
будет добавлен в treeWidget
один за другим (один элемент добавлен, через 2 секунды будет добавлен другой).
но когда я запускаю его, я нашел все Item
был добавлен один раз после долгого ожидания. Зачем?
как сделать это items
добавил, как я думаю?
Вы слишком долго блокируете поток графического интерфейса.
В идеале вы должны сделать PingHost в другом потоке, а внутри PingHost вы отправите сигнал, когда результат станет доступен. Затем у вас есть слот в главном окне, чтобы добавить элемент при получении сигнала.
если вы настаиваете на том, что делаете сейчас, вы можете попробовать обновить treeWidget в конце каждого цикла. Увидеть QWidget :: обновление ()
Других решений пока нет …