【问题标题】:Getting list of system printer names very slow in windows在 Windows 中获取系统打印机名称列表非常慢
【发布时间】:2016-09-19 18:29:43
【问题描述】:

我需要为打印创建一个非常自定义的小部件。它也必须是多平台的。为了保持一致性,小部件在 windows 中的外观应该与在 linux 或 mac 中相似......在研究了使用 Windows 打印对话框的 Qt 代码后,我放弃了尝试将 Qt 打印对话框子类化,并制作了自己的小部件。

所以,现在我进入第 1 步:填充系统上的打印机列表。我添加了以下代码,在每个“show()”上调用——以防系统上的打印机在程序执行期间发生变化——它可以工作,但速度非常慢:

我创建了一个索引/打印机映射,并将默认打印机添加为索引 -1,以告诉小部件它是哪一个。

QMap<int, QString> PrintController::getListOfSystemPrinters()
{
    QMap<int, QString> printerNames;

#ifdef Q_OS_WIN32
#ifdef NOT_QT_4   // I tried to use "availablePrinterNames" thinking it will be faster but it actually seems slower
    QPrinter currentPrinter;
    QString printerName = currentPrinter.printerName();

    QStringList printerNameList = QPrinterInfo::availablePrinterNames();

    int index = 0;
    foreach(QString printerName1, printerNameList)
    {
        printerNames.insert(index, printerName1);
        if(printerName == printerName1)
            printerNames.insert(-1, printerName1);
        ++index;
    }
#else
    QPrinter currentPrinter;
    QString printerName = currentPrinter.printerName();

    QList<QPrinterInfo> printers = QPrinterInfo::availablePrinters();

    int index = 0;
    foreach(QPrinterInfo printerInfo, printers)
    {
        QString printerName1 = printerInfo.printerName();
        printerNames.insert(index, printerName1);
        if(printerName == printerName1)
            printerNames.insert(-1, printerName1);
        ++index;
    }
#endif
#elif defined Q_OS_UNIX

#endif

    return printerNames;
}

这是我拥有的最慢的一段代码!我没有看到另一种获取所有打印机名称的方法......但我一定做错了什么!
Qt 5 版本比 Qt 4 版本稍慢......无论哪种方式,它们都很慢......
创建QPrinterInfo 的调用速度很慢。
那么……还有其他选择吗?

如何在 Windows 中获取打印机名称列表?

注意这必须在 Qt 4.7-5.x 中工作

【问题讨论】:

  • availablePrinterNames() 此处(Windows 上的 Qt 5.6.1)大约需要 9-13 msecs 才能完成。而availablePrinters() 大约需要110-150 msecs。没多久,我真的认为这与您当前的设置有关,可能是您的打印机驱动程序
  • @Mike - 我在网上读到,速度缓慢可能与网络打印机有关......我什至可能安装了不能真正解析为真正打印机的网络打印机...... .我没有计时它只是看着似乎使用availablePrinterNames需要更长的时间。但这可能是因为打印机本身...... idk

标签: windows qt printing


【解决方案1】:

异步获取打印机列表:

class Class : public QObject {
   Q_OBJECT
   Q_SIGNAL void hasPrinters(const QList<QPrinterInfo> &);
   Q_SIGNAL void hasPrinterNames(const QStringList &);

   /// This method is thread-safe
   void getPrinters() {
#if QT_VERSION >= QT_VERSION_CHECK(5,3,0)
         emit hasPrinterNames(QPrinterInfo::availablePrinterNames());
#else
         emit hasPrinters(QPrinterInfo::availablePrinters());
#endif
   }
   void test() {
      QtConcurrent::run(this, &Class::getPrinters);
   }
};

以上代码在 Qt 4.7 及更高版本上编译,使用 C++98 或 C++11。

连接到hasPrinterNames/hasPrinters 信号以在打印机列表可用时收到通知,然后填充您的对话框。

你可能很幸运,availablePrinterNames/availablePrinters 将是线程安全的。是不是我没查过。

在 Qt 5.3 和更高版本上,只有在用户选择给定打印机后才为给定打印机创建 QPrinterInfo,并且您可能还希望同时创建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多