Qt QTreeWidget逐个添加项目

时间:2013-03-04 02:23:31

标签: c++ qt user-interface qtreewidget qtreewidgetitem

这是我的代码

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 个答案:

答案 0 :(得分:1)

你阻止GUI线程太久了.. 理想情况下,你应该在另一个线程中进行PingHost,在PingHost中,你可以在结果可用时发送一个Signal。然后在主窗口中有一个SLOT,以便在收到信号时添加项目。

如果你坚持做你现在正在做的事情,你可以尝试在每个循环结束时更新treeWidget。见QWidget::update()