在Windows

时间:2016-09-19 18:29:44

标签: windows qt printing

我需要创建一个非常自定义的小部件进行打印。它也必须是多平台的。为了保持一致性,窗口小部件在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

1 个答案:

答案 0 :(得分:2)

异步获取打印机列表:

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&amp;使用C ++ 98或C ++ 11。

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

您可能很幸运,availablePrinterNames / availablePrinters将是线程安全的。我还没检查是否。

在Qt 5.3及更新版本中,只有在用户选择了特定打印机后才为其创建QPrinterInfo,并且您可能也希望同时创建它。