0

私は次のコードを持っています:

void Test1::on_pushButton_1_clicked() // print the information
{
QPrinter printer(QPrinter::HighResolution);
printer.setCreator("Me");
printer.setDocName("Print");
printer.setPaperSize(QPrinter::A4);

QPrintPreviewDialog *pd = new QPrintPreviewDialog(&printer);

connect(pd,SIGNAL(paintRequested(QPrinter*)),this,SLOT(print(QPrinter*)));

pd->exec();
}



void Test1::print(QPrinter *p)
{
QPainter painter(p);
painter.setPen(Qt::blue);

painter.setRenderHints(QPainter::Antialiasing |
                       QPainter::TextAntialiasing |
                       QPainter::SmoothPixmapTransform, true);

painter.drawText(100, 100, "Name: ");
painter.drawText(300, 100, "SuperMan");
}

1クラス[1ダイアログ]のみの実験プロジェクトで動作しますが、メインプロジェクトでは、ボタンを押すとプレビューが正常に開始されますが、「印刷」ボタンを押すとプログラムがクラッシュ。「プログラムが動作を停止しました。ウィンドウが解決策を探します」などと表示されます。私のプログラムには多くのクラスとダイアログがあると言わざるを得ません。ポインターに問題があることはほぼ確実です。経験が少ないので、自分の間違いがどこにあるかを見つけることができません。私のコードを見て、そのプロジェクトを完了するのにあと 2 日しかないので、どうすればよいか教えてください。よろしくお願いします。

4

3 に答える 3

1

その理由は、スタックにプリンターオブジェクトを作成するためだと思います

[..]
QPrinter printer(QPrinter::HighResolution);
[..]

それへのポインターを印刷プレビューダイアログに渡します。exec()プリンター オブジェクトがまだ生きている状態でダイアログが実行されるとすぐに、ダイアログを閉じるとTest1::on_pushButton_1_clicked()関数が終了するため、プリンター オブジェクトが破棄されます。それをさらに参照すると、クラッシュにつながります。解決策として、次のようにヒープからプリンターを作成してみてください。

void Test1::on_pushButton_1_clicked() // print the information
{
    // This printer should be deleted later.
    QPrinter *printer = new QPrinter(QPrinter::HighResolution);
    printer->setCreator("Me");
    printer->setDocName("Print");
    printer->setPaperSize(QPrinter::A4);

    QPrintPreviewDialog *pd = new QPrintPreviewDialog(printer);
    connect(pd, SIGNAL(paintRequested(QPrinter*)), this, SLOT(print(QPrinter*)));

    pd->exec();
}
于 2013-09-13T09:11:55.283 に答える
0

このプログラムの流れを考えてみると、なぜうまくいかないのかがわかります。

  1. スタック上にプリンターを作成し、それに信号を接続します。
  2. 印刷ダイアログが表示され、ユーザーは何でもできるようになります。
  3. 印刷ボタンが押されるなどの外部イベントにより、印刷ダイアログが閉じられ、範囲外になったため、スタック上のプリンターが破棄されます。
  4. スロットには、以前printは無効なメモリ空間があり、QPrinter*プログラム全体がクラッシュしました。

Qt では、まさにこの理由から、ほとんどすべてをヒープに割り当てる必要があります。

于 2013-09-13T13:39:06.427 に答える
0

皆さんの回答に感謝します。ついに問題を解決しました。どうやって解決しましたか? リリース モードをデバッグ モードに変更しました。タダーム。それでおしまい。ファイルはもう少し大きくなりますが、気にしないでください。すべてがうまく機能します。再度のご回答ありがとうございます。

于 2013-09-14T18:04:00.323 に答える