From: "Lubomir I. Ivanov" <[email protected]> When pressing Print or Preview from the PrintDialog, we need to first check if there are printers installed. If not we abort and show an error message.
This is needed because if no printers are installed, things like the reported page height could be zero and the profile and table print code in PrintLayout will break. Signed-off-by: Lubomir I. Ivanov <[email protected]> --- if someone has forgotten to install his printer driver and goes to the PrintDialog and then presses Preview/Print weird things can happen. Note: this does introduce a translation string. --- qt-ui/printdialog.cpp | 20 ++++++++++++++++++++ qt-ui/printdialog.h | 1 + 2 files changed, 21 insertions(+) diff --git a/qt-ui/printdialog.cpp b/qt-ui/printdialog.cpp index d1553ae..472b7d9 100644 --- a/qt-ui/printdialog.cpp +++ b/qt-ui/printdialog.cpp @@ -11,6 +11,8 @@ #include <QPrintPreviewDialog> #include <QPrintDialog> #include <QShortcut> +#include <QPrinterInfo> +#include <QMessageBox> PrintDialog::PrintDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { @@ -65,8 +67,24 @@ PrintDialog::PrintDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f connect(quit, SIGNAL(activated()), parent, SLOT(close())); } +bool PrintDialog::checkForAvailablePrinters(void) +{ + QList<QPrinterInfo> list = QPrinterInfo::availablePrinters(); + if (!list.length()) { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Critical); + msgBox.setText(tr("Subsurface cannot find installed printers on this system!")); + msgBox.setWindowIcon(QIcon(":subsurface-icon")); + msgBox.exec(); + return false; + } + return true; +} + void PrintDialog::previewClicked(void) { + if (!checkForAvailablePrinters()) + return; QPrintPreviewDialog previewDialog(&printer, this); connect(&previewDialog, SIGNAL(paintRequested(QPrinter *)), this, SLOT(onPaintRequested(QPrinter *))); previewDialog.exec(); @@ -74,6 +92,8 @@ void PrintDialog::previewClicked(void) void PrintDialog::printClicked(void) { + if (!checkForAvailablePrinters()) + return; QPrintDialog printDialog(&printer, this); if (printDialog.exec() == QDialog::Accepted){ printLayout->print(); diff --git a/qt-ui/printdialog.h b/qt-ui/printdialog.h index 32069a2..b290218 100644 --- a/qt-ui/printdialog.h +++ b/qt-ui/printdialog.h @@ -18,6 +18,7 @@ public: explicit PrintDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); private: + bool checkForAvailablePrinters(void); PrintOptions *optionsWidget; PrintLayout *printLayout; QProgressBar *progressBar; -- 1.7.11.msysgit.0 _______________________________________________ subsurface mailing list [email protected] http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface
