当前位置: 首页 > 知识库问答 >
问题:

在windows中获取系统打印机名称列表的速度非常慢

林修真
2023-03-14

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

所以,现在我开始了第一步:填充系统上的打印机列表。我添加了以下代码,以便在每个“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个答案

金正阳
2023-03-14

异步获取打印机列表:

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上编译

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

您可能很幸运,而且可用的internames将是线程安全的。我还没有检查它是否是。

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

 类似资料:
  • 问题内容: 有没有办法在mysql中获取表的列名?使用PHP 问题答案: 您可以使用DESCRIBE: 或者,在较新的版本中,您可以使用INFORMATION_SCHEMA: 或者您可以使用SHOW COLUMNS:

  • 我创建了一个简单的SpringBoot应用程序。有两类: 1) ManagedBean类 2) NonmangedBean:它具有ManagedBean类的依赖项 还有第三个服务类,它有Rest结束点。 首先,我调用 /processBeanendpoint,将具体对象的NonmangedBean类和自动连接它。(在这里,我知道bean将生活在Spring Container中,直到我关闭服务器。

  • 我正在开发一个将托管在tomcat服务器上的应用程序。我正在寻找获得用户名的详细信息,用户将登录到他的windows系统跟踪目的。在通过浏览器访问应用程序之前,是否有一种方法可以获得用户登录到系统的用户名详细信息?

  • > Hudson git命令非常慢(使用PuTTY中的plink.exe并设置GIT_SSH来使用它) 挂在“从Origin获取上游更改”处的Jenkins(将Jenkins改为使用cmd\git.exe而不是bin\git.exe) 有人能找到一个永久的解决办法吗? Jenkins的控制台输出日志: 由远程主机启动 在工作区F:\Jenkins\Jobs\xxx\workspace中的maste

  • 问题内容: 我正在尝试打印显示在Google搜索中的前5页链接。但是却收到StateElementReferenceException不知道哪一个出错了。 它可以打印到第二页,但是在我得到之后 问题答案: 有两件事: 您的脚本按预期打印前两页的结果。 当您第一次打电话时,它可以工作。 接下来,您将在的类型中存储10个页码。 第一次在循环中单击的 ,然后通过调用打印所有链接。 在循环内进行第二次迭代

  • X1.0新增 sp_get_host() 功能: 返回带协议的域名 参数: 无 返回: 类型string 带协议的域名,如http://www.thinkcmf.com