Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows中获取系统打印机名称列表的速度非常慢_Windows_Qt_Printing - Fatal编程技术网

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

在windows中获取系统打印机名称列表的速度非常慢,windows,qt,printing,Windows,Qt,Printing,我需要创建一个非常定制的打印小部件。它也必须是多平台的。为了保持一致性,该小部件在windows中的外观应与在linux或mac中的外观相似。。。在研究了使用Windows打印对话框的Qt代码之后,我放弃了尝试将Qt打印对话框子类化,并制作了自己的小部件 因此,现在我进入步骤1:填充系统上的打印机列表。我添加了以下代码,将在每个“show()”上调用-以防系统上的打印机在程序执行期间发生更改-它可以工作,但速度非常慢: 我创建了一个index/printer的映射,并将默认打印机添加为index

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

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

我创建了一个index/printer的映射,并将默认打印机添加为index-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;
}
QMap PrintController::getListOfSystemPrinters()
{
QMap-printerNames;
#ifdef Q_OS_WIN32
#如果没有,我试着使用“AvailableInternames”,认为它会更快,但实际上似乎更慢
QPrinter电流打印机;
QString printerName=currentPrinter.printerName();
QStringList printerNameList=QPrinterInfo::AvailableInternames();
int指数=0;
foreach(QString printerName1,printerNameList)
{
printerNames.insert(索引,printerName1);
if(printerName==printerName1)
printerNames.insert(-1,printerName1);
++指数;
}
#否则
QPrinter电流打印机;
QString printerName=currentPrinter.printerName();
QList printerns=QPrinterInfo::availableprints();
int指数=0;
foreach(QPrinterInfo printerInfo,打印机)
{
QString printerName1=printerInfo.printerName();
printerNames.insert(索引,printerName1);
if(printerName==printerName1)
printerNames.insert(-1,printerName1);
++指数;
}
#恩迪夫
#elif定义的Q_OS_UNIX
#恩迪夫
返回打印机名称;
}
这是我拥有的最慢的代码!我看不到其他方法来获取所有打印机名称。。。但我一定是做错了什么
Qt 5版本比Qt 4版本稍慢。。。无论哪种方式,它们都很慢……
创建
QPrinterInfo
的调用很慢。
所以还有其他选择吗

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


注意:这必须在Qt 4.7-5.x中工作,异步获取打印机列表:

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);
   }
};
class类:公共QObject{
Q_对象
Q_信号无效(const QList&);
Q_信号无效已打印名称(常量QStringList&);
///此方法是线程安全的
void getPrinters(){
#如果QT\u版本>=QT\u版本检查(5,3,0)
发出hasPrinterNames(QPrinterInfo::AvailableInterNames());
#否则
发射hasPrinters(QPrinterInfo::availablePrinters());
#恩迪夫
}
无效测试(){
QtConcurrent::run(this,&Class::getPrinters);
}
};
以上代码在Qt4.7及以上版本上编译,使用C++98或C++11

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


您可能很幸运,
可用内存
/
可用内存
将是线程安全的。我还没查过是不是


在Qt 5.3及更高版本上,仅在用户选择某台打印机后为其创建
QPrinterInfo
,您可能还希望同时创建该打印机。

异步获取打印机列表:

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);
   }
};
class类:公共QObject{
Q_对象
Q_信号无效(const QList&);
Q_信号无效已打印名称(常量QStringList&);
///此方法是线程安全的
void getPrinters(){
#如果QT\u版本>=QT\u版本检查(5,3,0)
发出hasPrinterNames(QPrinterInfo::AvailableInterNames());
#否则
发射hasPrinters(QPrinterInfo::availablePrinters());
#恩迪夫
}
无效测试(){
QtConcurrent::run(this,&Class::getPrinters);
}
};
以上代码在Qt4.7及以上版本上编译,使用C++98或C++11

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


您可能很幸运,
可用内存
/
可用内存
将是线程安全的。我还没查过是不是


在Qt 5.3及更高版本上,仅在用户选择某台打印机后为其创建
QPrinterInfo
,您可能还希望同时创建该打印机。

AvailableInternames()
此处(windows上的Qt 5.6.1)需要
9-13毫秒才能完成。而
availableprints()
大约需要
110-150毫秒。不是很长时间,我真的认为这与您当前的设置有关,可能与您的打印机有关drivers@Mike-我在网上看到,速度慢可能与网络打印机有关。。。有可能我甚至安装了网络打印机,但这些打印机并不是真正的打印机。。。我没有计时,只是看着使用AvailableInternames似乎需要更长的时间。但这可能是因为打印机本身。。。idk
AvailableInternames()
此处(windows上的Qt 5.6.1)大约需要
9-13毫秒才能完成。而
availableprints()
大约需要
110-150毫秒。不是很长时间,我真的认为这与您当前的设置有关,可能与您的打印机有关drivers@Mike-我在网上看到,速度慢可能与网络打印机有关。。。有可能我甚至安装了网络打印机,但这些打印机并不是真正的打印机。。。我没有计时,只是看着使用AvailableInternames似乎需要更长的时间。但这可能是因为打印机本身。。。idk