📄 qprintdialog_unix.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qplatformdefs.h"#ifndef QT_NO_PRINTDIALOG#include <private/qabstractprintdialog_p.h>#include "qprintdialog.h"#include "qfiledialog.h"#include "qdir.h"#include "qdesktopwidget.h"#include "qfile.h"#include "qtextstream.h"#include "qcombobox.h"#include "qframe.h"#include "qlabel.h"#include "qlineedit.h"#include "qpushbutton.h"#include "qprinter.h"#include "qlayout.h"#include "qbuttongroup.h"#include "qradiobutton.h"#include "qspinbox.h"#include "qapplication.h"#include "qstyle.h"#include "qstring.h"#include "qregexp.h"#include "qgroupbox.h"#include "qsignalmapper.h"#include "qmap.h"#include "qabstractitemmodel.h"#include "qtreeview.h"#include "qheaderview.h"#include "qmessagebox.h"#include "qdebug.h"#if !defined(QT_NO_CUPS) || !defined(QT_NO_NIS)#include "qlibrary.h"#endif#ifndef QT_NO_NIS#ifndef BOOL_DEFINED#define BOOL_DEFINED#endif#include <rpcsvc/ypclnt.h>#include <rpcsvc/yp_prot.h>#endif // QT_NO_NIS#include <ctype.h>#include <stdlib.h>enum { Success = 's', Unavail = 'u', NotFound = 'n', TryAgain = 't' };enum { Continue = 'c', Return = 'r' };struct QPrinterDescription { QPrinterDescription(const QString &n, const QString &h, const QString &c, const QStringList &a) : name(n), host(h), comment(c), aliases(a) {} QString name; QString host; QString comment; QStringList aliases; bool samePrinter(const QString& printer) const { return name == printer || aliases.contains(printer); }};class QPrinterModel : public QAbstractTableModel{public: QPrinterModel(const QList<QPrinterDescription> &printers, QObject *parent); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; QList<QPrinterDescription> lst;};QPrinterModel::QPrinterModel(const QList<QPrinterDescription> &printers, QObject *parent) : QAbstractTableModel(parent){ lst = printers;}int QPrinterModel::rowCount(const QModelIndex &) const{ return lst.count();}int QPrinterModel::columnCount(const QModelIndex &) const{ return 3;}QVariant QPrinterModel::data(const QModelIndex &index, int role) const{ if (index.isValid() && index.row() < (int)lst.count() && role == Qt::DisplayRole) { const QPrinterDescription &desc = lst.at(index.row()); switch(index.column()) { case 0: return desc.name; case 1: return desc.host; case 2: return desc.comment; } } return QVariant();}QVariant QPrinterModel::headerData(int section, Qt::Orientation orientation, int role) const{ if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { const char *name = 0; switch(section) { case 0: name = "Printer"; break; case 1: name = "Host"; break; case 2: name = "Comment"; break; } return qApp->translate("QPrintDialog", name); } return QAbstractTableModel::headerData(section, orientation, role);}class QPrintDialogPrivate : public QAbstractPrintDialogPrivate{ Q_DECLARE_PUBLIC(QPrintDialog)public: QButtonGroup *printerOrFile; bool outputToFile; QList<QPrinterDescription> printers; QPrinterModel *model; QTreeView *view; QLineEdit *fileName; QPushButton *browse, *ok; QButtonGroup *printRange; QLabel *firstPageLabel; QSpinBox *firstPage; QLabel *lastPageLabel; QSpinBox *lastPage; QRadioButton *printAllButton; QRadioButton *printRangeButton; QRadioButton *printSelectionButton; QRadioButton *printToPrinterButton; QRadioButton *printToFileButton; QComboBox *orientationCombo, *sizeCombo; QPrinter::PageSize pageSize; QPrinter::Orientation orientation; QButtonGroup *pageOrder; QRadioButton *firstPageFirst; QRadioButton *lastPageFirst; QPrinter::PageOrder pageOrder2; QButtonGroup *colorMode; QRadioButton *printColor; QRadioButton *printGray; QPrinter::ColorMode colorMode2; QSpinBox *copies; int numCopies; QBoxLayout *customLayout; QPrinter::PageSize indexToPageSize[QPrinter::NPageSize]; void init(); void _q_browseClicked(); void _q_okClicked(); void _q_printerOrFileSelected(QAbstractButton *b); void _q_landscapeSelected(int); void _q_paperSizeSelected(int); void _q_orientSelected(int); void _q_pageOrderSelected(QAbstractButton *); void _q_colorModeSelected(QAbstractButton *); void _q_setNumCopies(int); void _q_printRangeSelected(QAbstractButton *); void _q_setFirstPage(int); void _q_setLastPage(int); void _q_fileNameEditChanged(const QString &text); QGroupBox *setupDestination(); QGroupBox *setupOptions(); QGroupBox *setupPaper(); QGroupBox *setupPrinterSettings(); void setPrinter(QPrinter *p, bool pickUpSettings);};static void isc(QPrintDialogPrivate *d, const QString & text, QPrinter::PageSize ps);static void perhapsAddPrinter(QList<QPrinterDescription> *printers, const QString &name, QString host, QString comment, QStringList aliases = QStringList()){ for (int i = 0; i < printers->size(); ++i) if (printers->at(i).samePrinter(name)) return; if (host.isEmpty()) host = QPrintDialog::tr("locally connected"); printers->append(QPrinterDescription(name.simplified(), host.simplified(), comment.simplified(), aliases));}static void parsePrinterDesc(QString printerDesc, QList<QPrinterDescription> *printers){ if (printerDesc.length() < 1) return; printerDesc = printerDesc.simplified(); int i = printerDesc.indexOf(':'); QString printerName, printerComment, printerHost; QStringList aliases; if (i >= 0) { // have ':' want '|' int j = printerDesc.indexOf('|'); if (j > 0 && j < i) { printerName = printerDesc.left(j); aliases = printerDesc.mid(j + 1, i - j - 1).split('|'); // try extracting a comment from the aliases printerComment = QPrintDialog::tr("Aliases: %1") .arg(aliases.join(", ")); } else { printerName = printerDesc.left(i); } // look for lprng pseudo all printers entry i = printerDesc.indexOf(QRegExp(QLatin1String(": *all *="))); if (i >= 0) printerName = ""; // look for signs of this being a remote printer i = printerDesc.indexOf(QRegExp(QLatin1String(": *rm *="))); if (i >= 0) { // point k at the end of remote host name while (printerDesc[i] != '=') i++; while (printerDesc[i] == '=' || printerDesc[i].isSpace()) i++; j = i; while (j < (int)printerDesc.length() && printerDesc[j] != ':') j++; // and stuff that into the string printerHost = printerDesc.mid(i, j - i); } } if (printerName.length()) perhapsAddPrinter(printers, printerName, printerHost, printerComment, aliases);}static int parsePrintcap(QList<QPrinterDescription> *printers, const QString& fileName){ QFile printcap(fileName); if (!printcap.open(QIODevice::ReadOnly)) return NotFound; char *line_ascii = new char[1025]; line_ascii[1024] = '\0'; QString printerDesc; bool atEnd = false; while (!atEnd) { if (printcap.atEnd() || printcap.readLine(line_ascii, 1024) <= 0) atEnd = true; QString line = line_ascii; line = line.trimmed(); if (line.length() >= 1 && line[int(line.length()) - 1] == '\\') line.chop(1); if (line[0] == '#') { if (!atEnd) continue; } else if (line[0] == '|' || line[0] == ':') { printerDesc += line; if (!atEnd) continue; } parsePrinterDesc(printerDesc, printers); // add the first line of the new printer definition printerDesc = line; } delete[] line_ascii; return Success;}// solaris, not 2.6static void parseEtcLpPrinters(QList<QPrinterDescription> *printers){ QDir lp(QLatin1String("/etc/lp/printers")); QFileInfoList dirs = lp.entryInfoList(); if (dirs.isEmpty()) return; QString tmp; for (int i = 0; i < dirs.size(); ++i) { QFileInfo printer = dirs.at(i); if (printer.isDir()) { tmp.sprintf("/etc/lp/printers/%s/configuration", printer.fileName().toAscii().data()); QFile configuration(tmp); char *line = new char[1025]; QString remote(QLatin1String("Remote:")); QString contentType(QLatin1String("Content types:")); QString printerHost; bool canPrintPostscript = false; if (configuration.open(QIODevice::ReadOnly)) { while (!configuration.atEnd() && configuration.readLine(line, 1024) > 0) { if (QString::fromLatin1(line).startsWith(remote)) { const char *p = line; while (*p != ':') p++; p++; while (isspace((uchar) *p)) p++; printerHost = QString::fromLocal8Bit(p); printerHost = printerHost.simplified(); } else if (QString::fromLatin1(line).startsWith(contentType)) { char *p = line; while (*p != ':') p++; p++; char *e; while (*p) { while (isspace((uchar) *p)) p++; if (*p) { char s; e = p; while (isalnum((uchar) *e)) e++; s = *e; *e = '\0'; if (!qstrcmp(p, "postscript") || !qstrcmp(p, "any")) canPrintPostscript = true; *e = s; if (s == ',') e++; p = e; } } } } if (canPrintPostscript) perhapsAddPrinter(printers, printer.fileName(), printerHost, QLatin1String("")); } delete[] line; } }}// solaris 2.6static char *parsePrintersConf(QList<QPrinterDescription> *printers, bool *found = 0){ QFile pc(QLatin1String("/etc/printers.conf")); if (!pc.open(QIODevice::ReadOnly)) { if (found)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -