1

これは私のコードです

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(1件追加されて2秒後にもう1件追加されます。)

しかし、実行すると、Item長い間待った後にすべてが一度追加されていることがわかりました。なぜ?

それらitemsを私の思うように追加するにはどうすればよいですか?

4

1 に答える 1

1

GUIスレッドを長時間ブロックしています。理想的には、別のスレッドでPingHostを実行し、PingHost内で、結果が利用可能になったときにSignalを送信する必要があります。次に、メインウィンドウにSLOTがあり、信号を受信したときにアイテムを追加します。

現在行っていることを実行するように主張する場合は、各ループの最後でtreeWidgetを更新してみてください。QWidget :: update()を参照してください

于 2013-03-04T02:39:05.950 に答える