【发布时间】: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