⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qprintdialog_unix.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/******************************************************************************** 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 + -