QPrintDialog::open Usage on a Mac
-
I've searched everywhere and can't find an example..
How is QPrintDialog::open() different than QPrintDialog::exec() ?
What I'm trying to do is disable some buttons in a Mac QPrintDialog.
The buttons I want to disable are the PDF and Preview buttons. The reason I want to disable them is because they don't act as expected.
Cancel..it works and returns 0
Print..it works and returns 1
Preview..always returns 1. I can't tell what the user actually does. As soon as the user clicks the Preview button, the print dialog closes and returns 1 or accepted. Anything you want to do only on "Accepted" in gets done even if the user eventually Cancels and chooses not to print anything.
PDF..Again, always returns 1.. I can't tell what the user actually does. As soon as the user clicks the PDF button, the print dialog closes and returns 1 or accepted. Anything you want to do only on "Accepted" gets done even if the user eventually Cancels and chooses not to save as PDF.
What I'd like to do is disable the Preview & PDF buttons.
@
// create the dialog
QPrintDialog *printDialog = new QPrintDialog( printer, this );// hook signals to slots
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)));// search the dialog for child widgets
QList<QWidget *> pblist = printDialog->findChildren<QWidget *>();
#if DEBUG_PAGEMANAGERx
qDebug() << "PageManager::PDB items in button list:" << pblist.size();
#endif
foreach(QWidget *pb, pblist)
{
QString name = pb->objectName();
#if DEBUG_PAGEMANAGERx
qDebug() << "PageManager::PDB item name:" << name;
#endif
}int resultofexec = printDialog->exec();
@The above "foreach" is just supposed to capture the items of interest..not do anything with them yet. If possible, the idea would be to find the PDF and Preview buttons and just make them not visible.
I tried looking through the widgets, but the list is always empty. I tried changing QWidget to QPushButton and QToolButton, etc but the list is always 0.
I suspect that it may be because the print dialog is not really created until the "open()" or "exec()" call is made, but don't know for sure.
Am I just spinning my wheels? Should I just make my own Dialog that selects a printer and offers a Print & Cancel button?
-
Partial fix for determining if the user selected the PDF option in the standard Mac Print Dialog...
@
// set to nothing
printer->setOutputFileName("");QPrintDialog *printDialog = new QPrintDialog( printer, this );
int resultofexec = printDialog->exec();// if the user clicks PDF in the Mac print dialog, the outputFileName is NOT ""
// even if they click Cancel in the PDF dialog, outputFileName=="Untitled.pdf"
@Still looking for a way to determine if Preview is clicked...
-
Were you ever able to find a solution?
-
Not really an acceptable one..just a work-around.
@
public:
//DATA
enum pdWhat { pdHUH=-2, pdREJECTED=-1, pdFINISHED, pdACCEPTED };
pdWhat pdstatus; // print dialog statusQString pdmsg1; // message associated with print dialog accept/reject QString pdmsg2; QString pdprintername; // selscted printer and file re-direct QString pdprinterfilename;
void PageManager::PrintAccepted( QPrinter *p )
{
// slot for accept button clicked
pdstatus = pdACCEPTED;
pdmsg1 = "OK to print";// the selected printer as the painter destination
QPainter painter;if ( p->isValid() )
{
#if DEBUG_PAGEMANAGERx
qDebug() << "-s-PageManager::PrintAccepted - p->isValid():" << p->isValid();
qDebug() << "-s-PageManager::PrintAccepted - p->printerName():" << p->printerName();
#endif// should be OK to initialize p->setFullPage( true ); if ( painter.begin( p ) ) { // able to start the device painter.setRenderHint( QPainter::Antialiasing ); // draw scene to the printer printsheet->render( &painter ); // tell printer to "go" painter.end(); } else { // unable to start printer..we're hosed pdmsg1 = "unable to start printer"; pdmsg2 = "'" + p->printerName() + "'" + " failed at painter.begin"; #if DEBUG_PAGEMANAGERx qDebug() << "-s-PageManager::PrintAccepted - failed at painter.begin"; #endif }
}
else
{
#if DEBUG_PAGEMANAGERx
qDebug() << "-s-PageManager::PrintAccepted - printer NOT valid:";
qDebug() << "-s-PageManager::PrintAccepted - p->printerName():" << p->printerName();
#endif
}
}void PageManager::PrintFinished( int result)
{
// slot for dialog finished// search the dialog for child widgets..need to know the signal sender
/*
QList<QWidget *> pblist = printDialog->findChildren<QWidget *>();
#if DEBUG_PAGEMANAGERx
qDebug() << "PageManager::PDB items in button list:" << pblist.size();
#endif
foreach(QWidget *pb, pblist)
{
QString name = pb->objectName();
#if DEBUG_PAGEMANAGERx
qDebug() << "PageManager::PDB item name:" << name;
#endif
}
*/pdstatus = pdFINISHED;
#if DEBUG_PAGEMANAGERx
qDebug() << "-s-PageManager::PrintFinished" << QString::number(result) ;
#endif
}void PageManager::PrintRejected()
{
// slot for anything but accept button clicked
pdstatus = pdREJECTED;
pdmsg1 = "printing cancelled";
#if DEBUG_PAGEMANAGERx
qDebug() << "-s-PageManager::PrintRejected";
#endif
}@
-
--part 2--
@
//Part of PageManager::SaveLayout that handles printing..
// create a printer object and assume it's a physical printer NOT a file
QPrinter printer; // = new QPrinter(QPrinter::HighResolution);// set printer object to a known set of conditions
printer.setOutputFormat( QPrinter::NativeFormat );
printer.setResolution( QPrinter::HighResolution );// set the output file to a directory that has print (write) permission
QString xpng = QApplication::applicationDirPath() + GRAPHICSDIR + "X.png";
printer.setOutputFileName( xpng );// retrieve the printer info that's been initialized to show it's been set
pdprintername = printer.printerName();
pdprinterfilename = printer.outputFileName();#if DEBUG_PAGEMANAGERx
qDebug() << "--PageManager::SaveLayout - printDialog setup";
qDebug() << "---SaveLayout - dialog printer is valid:" << printer.isValid();
qDebug() << "---SaveLayout - dialog printer selected:" << pdprintername;
qDebug() << "---SaveLayout - dialog printer output filename:" << pdprinterfilename;
qDebug() << "---SaveLayout - dialog printer outputFormat:" << printer.outputFormat() ;
#endif// 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)
#if DEBUG_PAGEMANAGERx
qDebug() << "*PageManager::PrintDialog - begin";
#endifpdstatus = pdHUH;
pdmsg1 = "";
pdmsg2 = "";QPrintDialog printDialog( &printer );
printDialog.setWindowTitle( "Label Sheet Printing" );// 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)) );//??
// https://bugreports.qt-project.org/browse/QTBUG-17913
qApp->processEvents(QEventLoop::AllEvents);// if the user clicked PDF button in the Mac print dialog, the outputFileName is != ""
// if the user clicked Print button in the Mac print dialog, the outputFileName is == ""
int resultofexec = printDialog.exec();QPrinter *pdprinter = printDialog.printer();
// retrieve printer info
pdprintername = printer.printerName();
pdprinterfilename = printer.outputFileName();#if DEBUG_PAGEMANAGERx
qDebug() << "--PageManager::SaveLayout - printDialog exec() complete - return result:" << resultofexec;
qDebug() << "---SaveLayout - printer is valid:" << printer.isValid();
qDebug() << "---SaveLayout - printer selected:" << pdprintername;
qDebug() << "---SaveLayout - printer output filename:" << pdprinterfilename;
qDebug() << "---SaveLayout - printer outputFormat:" << printer.outputFormat() ;
#endif//
// pdstatus is set by the SLOTs connected to the printDialog
//
if ( pdstatus == pdACCEPTED )
{
#if DEBUG_PAGEMANAGERx
qDebug() << "-PageManager::PrintDialog pdACCEPTED";
#endif
//** print dialog has closed but it will MAGICALLY pipe or direct output to the **
//** selected destination ONLY if you run through painter->printer code in slot **
//
// 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()// we've now sent the print output wherever the hell it's going if ( pdprinterfilename == "" ) { // sent to the printer via the print or preview/print button #if DEBUG_PAGEMANAGERx qDebug() << "-PageManager::PrintDialog - pdstatus == pdACCEPTED - printer state:" << printer.printerState() ; #endif pdmsg1 = "previewed or print sent 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
{
// print dialog closed with cancel, reject, etc
#if DEBUG_PAGEMANAGERx
qDebug() << "-PageManager::PrintDialog - closed with cancel";
#endif
}qApp->restoreOverrideCursor();
// leave the message in the status area for ~60 seconds
gsb->showMessage( "done - " + pdmsg1 + " " + pdmsg2, 1000*60 );#if DEBUG_PAGEMANAGERx
qDebug() << "-PageManager::SaveLayout - PrintDialog - done";
#endif@
-
Hi,
Did you check the "bug report system":http://bugreports.qt-project.org to see whether it's a known issue ? If not you could consider opening a bug report with a minimal compilable example and instructions on how to reproduce the misbehavior
-
PSI-lbc: Thank you for the detailed response and source code. I tried stripped-down version that just included a slot for accepted(). Even in the slot, the QPrinter isn't reporting the file name entered.
SGalst: There is "QTBUG-2091":https://bugreports.qt-project.org/browse/QTBUG-2091 which is similar but the code isn't very minimal. I guess its time to report my first bug!
Thanks
-
Did you report it ? If so can you share the link ?
-
I reported it as "QTBUG-34404":https://bugreports.qt-project.org/browse/QTBUG-34404