0

私には 2 つの問題があります。1 つ目は非常に単純です。ボタンのリストがあります。それらの1つがクリックされてリストから削除され、動的に割り当てられたボタンが削除されたときに必要です。これは私が書いたスロットのコードです (コードにはいくつかの追加情報があります):

    void Window :: bla2()
{
    //I fond somewhere on the internet that apperantly "sender()" should return a pointer to the caller;
    for(int i = 0; i < List.size(); i++)
    {
        if(List[i] == sender())
        {
            List.removeOne(sender());
        }
    }
    delete sender();

}

さて、2 番目の質問として、テキスト ファイルを 1 行ずつ読み取り、各行をベクトルの要素として追加します。これは、ウィンドウとして機能する派生クラスの .cpp ファイルであるため、すべてが既に定義されています。ヘッダー部分。

 vtext = new QFile("one.txt"); // QFile variable
    while (vtext->atEnd() == false)
    {
       line = vtext->readLine(); //QString
           quotes.push_back(line);//quote is QVector<QString>
    }
4

1 に答える 1

2

最初の質問に答えるには:

Qtでそのオブジェクトによって呼び出されたスロット内のオブジェクトを削除することは許可されていません。有効なオブジェクトを見つけることを期待する現在のイベントへの反応として呼び出されるオブジェクトまたは他のスロットに投稿された他のイベントがある可能性があるため、これは正当な理由です。ボタンクリック信号が複数のスロットに接続されている状況を考えてみてください。最初のスロットが送信者を削除した場合、未定義の動作が発生します。QtはdeleteLater()この状況に対応します。deleteLater()プログラムが再びイベントループに入るまで、オブジェクトの削除を延期します。後でdeleteを複数回呼び出すことも安全です。

コードをからdelete Sender()に変更しますSender()->deleteLater();

リストがQObjectではなくQWidgetsである場合は、Sender()の結果をQWidgetにキャストする必要があります。このスロットがQWidgetであるものからのみ呼び出すことができると絶対に確信している場合は、先に進んで使用できますが、送信者が実際にウィジェットである場合にtrueを返すstatic_cast<QWidget*>(Sender())呼び出しによって、QObjectがQWidgetであるかどうかを最初にテストすることを強くお勧めしますSender()->isWidgetType()

あなたの2番目の質問が行く限り、それはあなたが思うことをするべきであるように見えます、私は質問が本当に何であるかを見ることができません。StackOverflowでは、一度に1つの質問をすることをお勧めします。この質問を編集して後半を取り出し、新しい質問として投稿することをお勧めします。他の人がコンパイルしてテストできる短い内容の例を示すことも良い習慣です。

于 2013-03-05T16:33:25.047 に答える