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

📄 qprintdialog_unix.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/******************************************************************************** Copyright (C) 1992-2007 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://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** 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 <QtGui/qapplication.h>#include <QtGui/qcheckbox.h>#include <QtCore/qlibrary.h>#include <QtCore/qlist.h>#include <QtGui/qprinter.h>#include <QtGui/qtreeview.h>#include <QtGui/qlistview.h>#include <QtGui/qevent.h>#include <QtGui/qmessagebox.h>#include "qprintdialog.h"#include "qfiledialog.h"#include <QtCore/qdebug.h>#include <QtCore/qobject.h>#include <QtGui/qabstractprintdialog.h>#include <QtGui/qitemdelegate.h>#include "qprintengine.h"#include "ui_qprintdialog.h"#include "ui_qprintpropertiesdialog.h"#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)#  include <private/qcups_p.h>#  include <cups/cups.h>#  include <private/qpdf_p.h>#endif#ifndef QT_NO_NIS#  ifndef BOOL_DEFINED#    define BOOL_DEFINED#  endif#  include <sys/types.h>#  include <rpc/rpc.h>#  include <rpcsvc/ypclnt.h>#  include <rpcsvc/yp_prot.h>#endif // QT_NO_NIS#ifdef Success#  undef Success#endif#include <ctype.h>class OptionTreeItem;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 QPrintDialogPrivate : public QAbstractPrintDialogPrivate{    Q_DECLARE_PUBLIC(QPrintDialog)public:    QPrintDialogPrivate();    ~QPrintDialogPrivate();    void init();    void applyPrinterProperties(QPrinter *p);    void _q_printToFileChanged(int);    void _q_rbPrintRangeToggled(bool);    void _q_printerChanged(int index);    void _q_chbPrintLastFirstToggled(bool);#ifndef QT_NO_FILEDIALOG    void _q_btnBrowseClicked();#endif    void _q_btnPropertiesClicked();    void refreshPageSizes();    bool setupPrinter();    void updateWidgets();    Ui::QPrintDialog ui;    QList<QPrinterDescription> lprPrinters;#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)    QCUPSSupport* cups;    int cupsPrinterCount;    const cups_dest_t* cupsPrinters;    const ppd_file_t* cupsPPD;#endif};#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)class PPDOptionsModel : public QAbstractItemModel{    friend class PPDPropertiesDialog;    friend class PPDOptionsEditor;public:    PPDOptionsModel(QCUPSSupport *cups, QObject *parent = 0);    ~PPDOptionsModel();    int columnCount(const QModelIndex& parent = QModelIndex()) const;    int rowCount(const QModelIndex& parent = QModelIndex()) const;    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;    QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const;    QModelIndex parent(const QModelIndex& index) const;    Qt::ItemFlags flags(const QModelIndex& index) const;    QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;private:    OptionTreeItem* rootItem;    QCUPSSupport *cups;    const ppd_file_t* ppd;    void parseItems();    void parseGroups(OptionTreeItem* parent);    void parseOptions(OptionTreeItem* parent);    void parseChoices(OptionTreeItem* parent);};class PPDOptionsEditor : public QItemDelegate{    Q_OBJECTpublic:    PPDOptionsEditor(QObject* parent = 0) : QItemDelegate(parent) {};    ~PPDOptionsEditor() {};    QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;    void setEditorData(QWidget* editor, const QModelIndex& index) const;    void setModelData( QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;private slots:    void cbChanged(int index);};class PPDPropertiesDialog : public QDialog , Ui::QPrintPropertiesDialog{    Q_OBJECTpublic:    PPDPropertiesDialog(PPDOptionsModel* model, QWidget* parent = 0, Qt::WindowFlags f = 0);    ~PPDPropertiesDialog();    void showEvent(QShowEvent * event);private:    void addItemToOptions(OptionTreeItem *parent, QList<const ppd_option_t*>& options, QList<const char*>& markedOptions);private slots:    void btnSaveClicked();};#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////enum { Success = 's', Unavail = 'u', NotFound = 'n', TryAgain = 't' };enum { Continue = 'c', Return = 'r' };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(QLatin1Char(':'));    QString printerName, printerComment, printerHost;    QStringList aliases;    if (i >= 0) {        // have ':' want '|'        int j = printerDesc.indexOf(QLatin1Char('|'));        if (j > 0 && j < i) {            printerName = printerDesc.left(j);            aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|'));            // try extracting a comment from the aliases            printerComment = QPrintDialog::tr("Aliases: %1")                             .arg(aliases.join(QLatin1String(", ")));        } else {            printerName = printerDesc.left(i);        }        // look for lprng pseudo all printers entry        i = printerDesc.indexOf(QRegExp(QLatin1String(": *all *=")));        if (i >= 0)            printerName = QString();        // 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] != QLatin1Char('='))                i++;            while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace())                i++;            j = i;            while (j < (int)printerDesc.length() && printerDesc[j] != QLatin1Char(':'))                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 = QString::fromLocal8Bit(line_ascii);        line = line.trimmed();        if (line.length() >= 1 && line[int(line.length()) - 1] == QLatin1Char('\\'))            line.chop(1);        if (line[0] == QLatin1Char('#')) {            if (!atEnd)                continue;        } else if (line[0] == QLatin1Char('|') || line[0] == QLatin1Char(':')) {            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)            *found = false;        return 0;    }    if (found)        *found = true;    char *line = new char[1025];    line[1024] = '\0';    QString printerDesc;    int lineLength = 0;    char *defaultPrinter = 0;    while (!pc.atEnd() &&            (lineLength=pc.readLine(line, 1024)) > 0) {        if (*line == '#') {            *line = '\0';            lineLength = 0;        }        if (lineLength >= 2 && line[lineLength-2] == '\\') {            line[lineLength-2] = '\0';            printerDesc += QString::fromLocal8Bit(line);        } else {            printerDesc += QString::fromLocal8Bit(line);            printerDesc = printerDesc.simplified();            int i = printerDesc.indexOf(QLatin1Char(':'));            QString printerName, printerHost, printerComment;            QStringList aliases;            if (i >= 0) {                // have : want |                int j = printerDesc.indexOf(QLatin1Char('|'));                if (j >= i)                    j = -1;                printerName = printerDesc.mid(0, j < 0 ? i : j);                if (printerName == QLatin1String("_default")) {                    i = printerDesc.indexOf(                        QRegExp(QLatin1String(": *use *=")));                    while (printerDesc[i] != QLatin1Char('='))                        i++;                    while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace())                        i++;                    j = i;                    while (j < (int)printerDesc.length() &&                            printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(','))                        j++;                    // that's our default printer                    defaultPrinter =                        qstrdup(printerDesc.mid(i, j-i).toAscii().data());                    printerName = QString();                    printerDesc = QString();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -