クラスQPrinterおよびQPainterを使用して、Windows 仮想デバイスで PDF ファイルに印刷しています。QPainterオブジェクトは、PDF ファイルのパスと名前を入力できるダイアログ ウィンドウを開きます。
意図した用途では正しく機能します。ただし、ダイアログで [キャンセル] ボタンを押すと、アプリケーションがクラッシュします。エラーを再現するコード スニペットを次に示します。
#include <iostream>
#include <QApplication>
#include <QPrinterInfo>
#include <QPainter>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
foreach(QPrinterInfo printerInfo, QPrinterInfo::availablePrinters()) {
if (printerInfo.state() == QPrinter::PrinterState::Error)
continue;
// Look for the virtual printer device that generates a pdf.
if (printerInfo.printerName() == "Microsoft Print to PDF")
{
QPrinter * qPrinter = new QPrinter(printerInfo, QPrinter::HighResolution);
QPainter * qPainter = new QPainter();
// This statement pops up a file selection dialog.
// When it is cancelled, the application crashes ...
qPainter->begin(qPrinter);
// ... and this statement is never reached.
std::cout << "Starting printing on the pdf file." << std::endl;
// We print some text in the PDF file.
qPainter->drawText(100, 100, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
qPrinter->newPage();
qPainter->drawText(100, 100, "Mauris ut urna eget dui eleifend placerat.");
qPrinter->newPage();
// Close the printer and clean-up.
qPainter->end();
delete qPrinter;
delete qPainter;
}
}
return 0;
}
[キャンセル] ボタンを押すと、 QPainter::begin()の呼び出し中にアプリケーションがクラッシュします。何か不足していますか?その方法にバグがある可能性はありますか?
更新: QPainter::begin() への呼び出しを try-catch で保護しても、クラッシュは防止されませんでした:
#include <iostream>
#include <QApplication>
#include <QPrinterInfo>
#include <QPainter>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
foreach(QPrinterInfo printerInfo, QPrinterInfo::availablePrinters()) {
if (printerInfo.state() == QPrinter::PrinterState::Error)
continue;
// Look for the virtual printer device that generates a pdf.
if (printerInfo.printerName() == "Microsoft Print to PDF")
{
QPrinter * qPrinter = new QPrinter(printerInfo, QPrinter::HighResolution);
QPainter * qPainter = new QPainter();
// This statement pops up a file selection dialog.
// When it is cancelled, the application crashes ...
try
{
qPainter->begin(qPrinter);
}
catch(...) { }
// ... and this statement is never reached.
std::cout << "Starting printing on the pdf file." << std::endl;
if (qPainter->isActive())
{
// We print some text in the PDF file.
qPainter->drawText(100, 100, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
qPrinter->newPage();
qPainter->drawText(100, 100, "Mauris ut urna eget dui eleifend placerat.");
qPrinter->newPage();
qPainter->end();
}
// Close the printer and clean-up.
delete qPrinter;
delete qPainter;
}
}
return 0;
}