📄 qprintdialog_unix.cpp
字号:
QString()); else if (deviceName.length()) // local printer perhapsAddPrinter(printers, stanzaName, QString(), QString()); } line.chop(1); if (line.length() >= 1 && line.length() <= 20) stanzaName = line; up = true; remoteHost.clear(); deviceName.clear(); } else { // syntax error? ignore. } } while (!ts.atEnd());}#ifndef QT_NO_CUPS#include <cups/cups.h>static char *parseCupsOutput(QList<QPrinterDescription> *printers){ char *defaultPrinter = 0;#ifdef QT_NO_LIBRARY Q_UNUSED(printers);#else int nd; cups_dest_t *d; QLibrary lib("cups", 2); typedef int (*CupsGetDests)(cups_dest_t **dests); typedef void (*CupsFreeDests)(int, cups_dest_t *); CupsGetDests _cupsGetDests = (CupsGetDests)lib.resolve("cupsGetDests"); CupsFreeDests _cupsFreeDests = (CupsFreeDests)lib.resolve("cupsFreeDests"); if (_cupsGetDests) { nd = _cupsGetDests(&d); if (nd < 1) return 0; int n = 0; while (n < nd) { perhapsAddPrinter(printers, d[n].name, QPrintDialog::tr("Unknown Location"), QString()); if (d[n].is_default && !defaultPrinter) defaultPrinter = qstrdup(d[n].instance); n++; } if (_cupsFreeDests) _cupsFreeDests(nd, d); }#endif return defaultPrinter;}#endifQPrintDialog::QPrintDialog(QPrinter *printer, QWidget *parent) : QAbstractPrintDialog(*(new QPrintDialogPrivate), printer, parent){ d_func()->init();}/*! Destroys the object and frees any allocated resources. Does not delete the associated QPrinter object.*/QPrintDialog::~QPrintDialog(){}QGroupBox *QPrintDialogPrivate::setupPrinterSettings(){ Q_Q(QPrintDialog); QGroupBox *g = new QGroupBox(QPrintDialog::tr("Printer settings"), q); QBoxLayout *tll = new QBoxLayout(QBoxLayout::Down, g); colorMode = new QButtonGroup(q); QObject::connect(colorMode, SIGNAL(buttonClicked(QAbstractButton*)), q, SLOT(_q_colorModeSelected(QAbstractButton*))); printColor = new QRadioButton(QPrintDialog::tr("Print in color if available"), g); colorMode->addButton(printColor); printColor->setChecked(true); tll->addWidget(printColor); printGray = new QRadioButton(QPrintDialog::tr("Print in grayscale"), g); colorMode->addButton(printGray); tll->addWidget(printGray); return g;}QGroupBox *QPrintDialogPrivate::setupDestination(){ Q_Q(QPrintDialog); QGroupBox *g = new QGroupBox(QPrintDialog::tr("Print destination"), q); QBoxLayout *tll = new QBoxLayout(QBoxLayout::Down, g); printerOrFile = new QButtonGroup(q); // printer radio button, list printToPrinterButton = new QRadioButton(QPrintDialog::tr("Print to printer:"), g); tll->addWidget(printToPrinterButton); printerOrFile->addButton(printToPrinterButton); printToPrinterButton->setChecked(true); outputToFile = false; QBoxLayout *horiz = new QBoxLayout(QBoxLayout::LeftToRight); tll->addLayout(horiz, 3); horiz->addSpacing(19); char *etcLpDefault = 0;#ifndef QT_NO_CUPS etcLpDefault = parseCupsOutput(&printers);#endif if (printers.size() == 0) { // we only use other schemes when cups fails. parsePrintcap(&printers, QLatin1String("/etc/printcap")); parseEtcLpMember(&printers); parseSpoolInterface(&printers); parseQconfig(&printers); QFileInfo f; f.setFile(QLatin1String("/etc/lp/printers")); if (f.isDir()) { parseEtcLpPrinters(&printers); QFile def(QLatin1String("/etc/lp/default")); if (def.open(QIODevice::ReadOnly)) { if (etcLpDefault) delete[] etcLpDefault; etcLpDefault = new char[1025]; if (def.readLine(etcLpDefault, 1024) > 0) { char *p = etcLpDefault; while (p && *p) { if (!isprint((uchar) *p) || isspace((uchar) *p)) *p = 0; else ++p; } } } } char *def = 0; f.setFile(QLatin1String("/etc/nsswitch.conf")); if (f.isFile()) { def = parseNsswitchConf(&printers); } else { f.setFile(QLatin1String("/etc/printers.conf")); if (f.isFile()) def = parsePrintersConf(&printers); } if (def) { if (etcLpDefault) delete[] etcLpDefault; etcLpDefault = def; } } // all printers hopefully known. try to find a good default QString dollarPrinter; { if (!qgetenv("PRINTER").isEmpty()) dollarPrinter = QString::fromLocal8Bit(qgetenv("LPDEST").constData()); if (!dollarPrinter.isEmpty()) perhapsAddPrinter(&printers, dollarPrinter, QPrintDialog::tr("unknown"), QLatin1String("")); } model = new QPrinterModel(printers, q); view = new QTreeView(g); view->setMinimumHeight(100); view->setModel(model); view->setRootIsDecorated(false); view->header()->setResizeMode(2, QHeaderView::Stretch); // bang the best default into the listview int quality = 0; int best = 0; for (int i = 0; i < printers.size(); ++i) { QRegExp ps(QLatin1String("[^a-z]ps(?:[^a-z]|$)")); QRegExp lp(QLatin1String("[^a-z]lp(?:[^a-z]|$)")); QString name = printers.at(i).name; QString comment = printers.at(i).comment; if (quality < 4 && name == dollarPrinter) { best = i; quality = 4; } else if (quality < 3 && etcLpDefault && name == QLatin1String(etcLpDefault)) { best = i; quality = 3; } else if (quality < 2 && (name == QLatin1String("ps") || ps.indexIn(comment) != -1)) { best = i; quality = 2; } else if (quality < 1 && (name == QLatin1String("lp") || lp.indexIn(comment) > -1)) { best = i; quality = 1; } } view->setCurrentIndex(static_cast<QAbstractTableModel*>(model)->index(best, 0)); if (etcLpDefault) // Avoid purify complaint delete[] etcLpDefault;// int h = fontMetrics().height();// if (printers.size())// h = view->itemViewportRect(model->index(0, 0)).height();// view->setMinimumSize(view->sizeHint().width(),// printers->header()->height() +// 3 * h); horiz->addWidget(view, 3); // file radio button, edit/browse printToFileButton = new QRadioButton(QPrintDialog::tr("Print to file:"), g); tll->addWidget(printToFileButton); printerOrFile->addButton(printToFileButton); horiz = new QBoxLayout(QBoxLayout::LeftToRight); tll->addLayout(horiz); horiz->addSpacing(19); fileName = new QLineEdit(g); QObject::connect(fileName, SIGNAL(textChanged(QString)), q, SLOT(_q_fileNameEditChanged(QString))); horiz->addWidget(fileName, 1); browse = new QPushButton(QPrintDialog::tr("Browse..."), g); browse->setAutoDefault(false); QObject::connect(browse, SIGNAL(clicked()), q, SLOT(_q_browseClicked())); horiz->addWidget(browse); fileName->setEnabled(false); browse->setEnabled(false); QObject::connect(printerOrFile, SIGNAL(buttonClicked(QAbstractButton*)), q, SLOT(_q_printerOrFileSelected(QAbstractButton*))); return g;}QGroupBox *QPrintDialogPrivate::setupOptions(){ Q_Q(QPrintDialog); QGroupBox *g = new QGroupBox(QPrintDialog::tr("Options"), q); QBoxLayout *lay = new QBoxLayout(QBoxLayout::LeftToRight, g); QBoxLayout *tll = new QBoxLayout(QBoxLayout::Down); lay->addLayout(tll); printRange = new QButtonGroup(q); QObject::connect(printRange, SIGNAL(buttonClicked(QAbstractButton*)), q, SLOT(_q_printRangeSelected(QAbstractButton*))); pageOrder = new QButtonGroup(q); QObject::connect(pageOrder, SIGNAL(buttonClicked(QAbstractButton*)), q, SLOT(_q_pageOrderSelected(QAbstractButton*))); printAllButton = new QRadioButton(QPrintDialog::tr("Print all"), g); printRange->addButton(printAllButton); tll->addWidget(printAllButton); printSelectionButton = new QRadioButton(QPrintDialog::tr("Print selection"), g); printRange->addButton(printSelectionButton); tll->addWidget(printSelectionButton); printRangeButton = new QRadioButton(QPrintDialog::tr("Print range"), g); printRange->addButton(printRangeButton); tll->addWidget(printRangeButton); QBoxLayout *horiz = new QBoxLayout(QBoxLayout::LeftToRight); tll->addLayout(horiz); firstPageLabel = new QLabel(QPrintDialog::tr("From page:"), g); horiz->addSpacing(19); horiz->addWidget(firstPageLabel); firstPage = new QSpinBox(g); firstPage->setRange(1, 9999); firstPage->setValue(1); horiz->addWidget(firstPage, 1); QObject::connect(firstPage, SIGNAL(valueChanged(int)), q, SLOT(_q_setFirstPage(int))); horiz = new QBoxLayout(QBoxLayout::LeftToRight); tll->addLayout(horiz); lastPageLabel = new QLabel(QPrintDialog::tr("To page:"), g); horiz->addSpacing(19); horiz->addWidget(lastPageLabel); lastPage = new QSpinBox(g); lastPage->setRange(1, 9999); lastPage->setValue(9999); horiz->addWidget(lastPage, 1); QObject::connect(lastPage, SIGNAL(valueChanged(int)), q, SLOT(_q_setLastPage(int))); lay->addSpacing(25); tll = new QBoxLayout(QBoxLayout::Down); lay->addLayout(tll); // print order firstPageFirst = new QRadioButton(QPrintDialog::tr("Print first page first"), g); tll->addWidget(firstPageFirst); pageOrder->addButton(firstPageFirst); firstPageFirst->setChecked(true); lastPageFirst = new QRadioButton(QPrintDialog::tr("Print last page first"), g); tll->addWidget(lastPageFirst); pageOrder->addButton(lastPageFirst); tll->addStretch(); // copies horiz = new QBoxLayout(QBoxLayout::LeftToRight); tll->addLayout(horiz); QLabel *l = new QLabel(QPrintDialog::tr("Number of copies:"), g); horiz->addWidget(l); copies = new QSpinBox(g); copies->setRange(1,99); copies->setValue(1); horiz->addWidget(copies, 1); QObject::connect(copies, SIGNAL(valueChanged(int)), q, SLOT(_q_setNumCopies(int))); QSize s = firstPageLabel->sizeHint() .expandedTo(lastPageLabel->sizeHint()) .expandedTo(l->sizeHint()); firstPageLabel->setMinimumSize(s); lastPageLabel->setMinimumSize(s); l->setMinimumSize(s.width() + 19, s.height()); return g;}void isc(QPrintDialogPrivate *ptr, const QString & text, QPrinter::PageSize ps){ if (ptr && !text.isEmpty() && ps < QPrinter::NPageSize) { ptr->sizeCombo->addItem(text); int index = ptr->sizeCombo->count()-1; if (index >= 0 && index < QPrinter::NPageSize) ptr->indexToPageSize[index] = ps; }}QGroupBox *QPrintDialogPrivate::setupPaper(){ Q_Q(QPrintDialog); QGroupBox *g = new QGroupBox(QPrintDialog::tr("Paper format"), q); QBoxLayout *tll = new QBoxLayout(QBoxLayout::Down, g); pageSize = QPrinter::A4; // page orientation orientationCombo = new QComboBox(g); orientationCombo->addItem(QPrintDialog::tr("Portrait")); orientationCombo->addItem(QPrintDialog::tr("Landscape")); tll->addWidget(orientationCombo); orientation = QPrinter::Portrait; QObject::connect(orientationCombo, SIGNAL(activated(int)), q, SLOT(_q_orientSelected(int))); // paper size sizeCombo = new QComboBox(g); tll->addWidget(sizeCombo); int n; for(n=0; n<QPrinter::NPageSize; n++) indexToPageSize[n] = QPrinter::A4; isc(this, QPrintDialog::tr("A0 (841 x 1189 mm)"), QPrinter::A0); isc(this, QPrintDialog::tr("A1 (594 x 841 mm)"), QPrinter::A1); isc(this, QPrintDialog::tr("A2 (420 x 594 mm)"), QPrinter::A2); isc(this, QPrintDialog::tr("A3 (297 x 420 mm)"), QPrinter::A3); isc(this, QPrintDialog::tr("A4 (210 x 297 mm, 8.26 x 11.7 inches)"), QPrinter::A4); isc(this, QPrintDialog::tr("A5 (148 x 210 mm)"), QPrinter::A5); isc(this, QPrintDialog::tr("A6 (105 x 148 mm)"), QPrinter::A6); isc(this, QPrintDialog::tr("A7 (74 x 105 mm)"), QPrinter::A7); isc(this, QPrintDialog::tr("A8 (52 x 74 mm)"), QPrinter::A8); isc(this, QPrintDialog::tr("A9 (37 x 52 mm)"), QPrinter::A9); isc(this, QPrintDialog::tr("B0 (1000 x 1414 mm)"), QPrinter::B0); isc(this, QPrintDialog::tr("B1 (707 x 1000 mm)"), QPrinter::B1); isc(this, QPrintDialog::tr("B2 (500 x 707 mm)"), QPrinter::B2); isc(this, QPrintDialog::tr("B3 (353 x 500 mm)"), QPrinter::B3); isc(this, QPrintDialog::tr("B4 (250 x 353 mm)"), QPrinter::B4); isc(this, QPrintDialog::tr("B5 (176 x 250 mm, 6.93 x 9.84 inches)"), QPrinter::B5); isc(this, QPrintDialog::tr("B6 (125 x 176 mm)"), QPrinter::B6);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -