Qt QTreeWidget добавляет элементы по одному

это мой код

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 добавил, как я думаю?

1

Решение

Вы слишком долго блокируете поток графического интерфейса.
В идеале вы должны сделать PingHost в другом потоке, а внутри PingHost вы отправите сигнал, когда результат станет доступен. Затем у вас есть слот в главном окне, чтобы добавить элемент при получении сигнала.

если вы настаиваете на том, что делаете сейчас, вы можете попробовать обновить treeWidget в конце каждого цикла. Увидеть QWidget :: обновление ()

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]