Printer bugs on MacOS
-
Are there any known bugs or issues to be aware of with Mac Print Drivers for Qt?
I'm having an issue of an app not being able to print on 1 beta testers machine MacOS 10.5.x & 10.6.x. The tester switched to 10.6.x and the app would print. He then purchased a new printer and the app will not print..but he can print from other apps.
It works fine on my Mac Mini dev environment (MacOS 10.6.x) and 2 in-house Mac laptops I've tested it on. It works fine on 2 other beta testers machines (MacOS 10.6.x & 10.7.x).
The print output is just a graphics scene that that gets rendered to a painter device that is a physical printer.
@
// scene is built..wait to render it until after the printer has been selected// create a printer object and assume it's a physical printer NOT a file
QPrinter *printer = new QPrinter(QPrinter::HighResolution);// the Mac print dialog can't be set to PDF or PS format
// set printer to a known conditions
printer->setOutputFormat( QPrinter::NativeFormat );
printer->setOutputFileName("X");// global status bar message
gsb->showMessage("selecting a printer");
qApp->processEvents();//print issue..works on dev macs(10.6.x), but not on tester's iMac(10.5.8)
// enum pdWhat { pdHUH=-2, pdREJECTED=-1, pdFINISHED, pdACCEPTED };
pdstatus = pdHUH;
pdmsg1 = "";
pdmsg2 = "";QPrintDialog *printDialog = new QPrintDialog( printer, this );
// hook print dialog signals so we can set progress and result messages
connect(printDialog, SIGNAL(accepted(QPrinter *)), this, SLOT(PrintAccepted(QPrinter *)));
connect(printDialog, SIGNAL(rejected()), this, SLOT(PrintRejected()));
connect(printDialog, SIGNAL(finished(int)), this, SLOT(PrintFinished(int)));// if the user clicked PDF in the Mac print dialog, the outputFileName is NOT ""
int resultofexec = printDialog->exec();pdprintername = printer->printerName();
pdprinterfilename = printer->outputFileName();// pdstatus is set by the SLOTs connected to the printDialog
if ( pdstatus == pdACCEPTED )
{
//** print dialog has closed but it will MAGICALLY pipe or direct output to the **
//** selected destination ONLY if you run through painter->printer code below **
//
// PDF redirects to a file ONLY if you run through painter->printer code below
// if dialog used PDF option..output file name will be != "X" && != ""
//
// Preview redirects to printer ONLY if you run through painter->printer code below
// if dialog used Preview or Print options..output file name will be == ""
//
qApp->setOverrideCursor(QCursor( Qt::WaitCursor ));
// global status bar message
gsb->showMessage("formatting print output");
qApp->processEvents();// should be OK to initialize printer->setFullPage( true ); qreal tm,lm,rm,bm; printer->getPageMargins(&lm,&tm,&rm,&bm,QPrinter::Inch); // adjust the bottom margin..or try to..doh! printer->setPageMargins(lm, tm, rm, 0.25, QPrinter::Inch); // see if the page margin change took effect // the selected printer as the painter destination QPainter painter; if ( painter.begin( printer ) ) { // able to start the device painter.setRenderHint( QPainter::Antialiasing ); // draw scene to the printer scene->render( &painter ); // tell printer to "go" painter.end(); // we've now sent the print output wherever the hell it's going if ( pdprinterfilename == "X" ) { // sent to the printer via the print button pdmsg1 = "sending print to "; pdmsg2 = pdprintername; } else if ( pdprinterfilename == "" ) { // sent to the printer via the preview button pdmsg1 = "showing a preview to "; pdmsg2 = pdprintername; } else { // print dialog accepted...but really saved to PDF pdmsg1 = "printing redirected to "; // outputfilename is full path..snag the last section pdmsg2 = "'" + pdprinterfilename.section('/', -1) + "'"; } } else { // unable to start printer..we're hosed pdmsg2 += "failed at painter.begin"; }
}
else
{
// print dialog closed with cancel, reject, etc
}qApp->restoreOverrideCursor();
// leave the message in the status area for ~60 seconds
gsb->showMessage( "done - " + pdmsg1 + pdmsg2, 1000*60 );
}void PageManager::PrintAccepted( QPrinter * )
{
// slot for accept button clicked
pdstatus = pdACCEPTED;
pdmsg1 = "OK to print";
}void PageManager::PrintFinished( int result)
{
// slot for dialog finished..just eat signalpdstatus = pdFINISHED;
}void PageManager::PrintRejected()
{
// slot for anything but accept button clicked
pdstatus = pdREJECTED;
pdmsg1 = "printing cancelled";
}void PageManager::PrintOther(const QPoint &clickpos )
{
// slot for other button clicked
pdstatus = pdREJECTED;
pdmsg1 = "printing to PDF or Preview";
}@
-
This code works on the system having the "print problem"..so it appears it may be something associated with "rendering to a painter" code in the previous post...not the Mac Print drivers.
@
QString detail;
QTextStream out(&detail);// stream the report in HTML format
// NOTE: html rules are ignored byt the setHtml function..
// specifically nested tables are not allowed
// setting column sizes to a specific % not allowed
out << "<table width="100%"><caption><b>" + QCoreApplication::applicationName() + "-" + QCoreApplication::applicationVersion() + "</b></caption>";
out << "<tr><td>User Record Summary for: " << ur->loadedname ;
out << "</table><hr size=1>";QPrinter *printer = new QPrinter(QPrinter::HighResolution);
printer->setFullPage( true );QPrintDialog *printDialog = new QPrintDialog( printer );
if (printDialog->exec() == QDialog::Accepted)
{
printer->setFullPage( true );QTextDocument qtd;
qtd.setHtml( detail );
qtd.print( printer );
}@
It doesn't make sense that the render to printer stuff works on most Macs, but one Mac has a problem. Argh!
-
This post is deleted!