2013-03-04 28 views
1

這是我的代碼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

您正在屏蔽GUI線程太長.. 理想情況下,您應該在另一個線程中執行PingHost,並在PingHost內部發送信號,以便在結果可用時發送信號。然後在主窗口中有一個SLOT在收到信號時添加該項目。

如果你堅持做你現在正在做的事情,你可以嘗試在每個循環結束時更新treeWidget。見QWidget::update()

+0

我改變了我的代碼。 – midCat 2013-03-04 02:46:24

+0

所以startPing是在另一個線程? – zzk 2013-03-04 03:02:14

+0

不,不是另一個線程 – midCat 2013-03-04 06:29:07

相關問題