0

私のプロジェクトには listWidget があります。ユーザーがリスト内の項目をクリックすると、これが読み込まれます。

void BlockSelect::on_blockList_clicked(const QModelIndex &index)
{
    QString blockListName;
    QString temp_hex;
    QString temp_hex2;
    int temp_int;

    QListWidgetItem *newitem = ui->blockList->currentItem();

    blockListName = newitem->text();
    temp_hex = blockListName.mid(0, blockListName.indexOf(" "));

    if(temp_hex.indexOf(":") == -1)
    {
        temp_int = temp_hex.toInt();
        ui->blockIdIn->setValue(temp_int);
        ui->damageIdIn = 0;
    }
    else
    {
        temp_hex2 = temp_hex.mid(temp_hex.indexOf(":")+1, temp_hex.length()-(temp_hex.indexOf(":")+1));
        temp_hex = temp_hex.mid(0, temp_hex.indexOf(":"));
        temp_int = temp_hex.toInt();
        ui->blockIdIn->setValue(temp_int);
        temp_int = temp_hex2.toInt();
        ui->damageIdIn->setValue(temp_int);
    }
}

これのほとんどは単なる文字列操作です。(この構文などを勉強する必要はありません)

私の問題は、ユーザーが別のリスト項目をすばやく (この現在のプロセスが終了する前に) クリックすると、プログラムがクラッシュすることです。高速クリック (一度に複数のプロセス) または代替ソリューションを許可する方法はありますか?

御時間ありがとうございます :)

4

1 に答える 1

1

このコードはすべて GUI スレッドで実行してください。もしそうなら、問題はありません - あなたのコードが正しければ (そうではありません)。あなたが質問で言及した「プロセス」のようなものはありません。クリックはスロットによって処理され、リスト内のイベント ハンドラーから呼び出されます。これはクラッシュすることは想定されておらず、クリックはシリアル化された方法で処理されます。

ここにバグがあります: 割り当てられた UI ポインター要素の値をゼロにリセットするのはなぜですか?

ui->damageIdIn = 0;

これはナンセンスです。多分あなたはまたはすることを意味しui->damageIdIn->setValue(0)ますui->damageIdIn->hide()。次に、このゼロ値を

ui->damageIdIn->setValue(temp_int);

そしてクラッシュします。

コードの他の場所にバグがある場合もあります。

于 2013-10-09T03:45:58.173 に答える