我试图在不使用QPrintDialog的情况下实例化打印机,因为我们的GUI是QML,其中QPrintDialog不存在(我们在QML中创建打印机选择对话框)。我正在调用两个可调用的C ++函数1)一个函数检索有效打印机列表并将其传递回QML,以及2)第二个函数实例化用户在QML中选择的打印机名称,然后打印到画家。我在Qt5.4.0上使用Ubuntu Linux(32)。我发现的一个有趣的问题是,当我使用QPrinterInfo :: availablePrinterNames()时,找到了一个有效的打印机名称列表。当我通过使用静态函数QPrinterInfo :: availablePrinters()获取QPrinterInfo对象列表,然后遍历列表并在printerName中显示名称,返回一个空字符串。文档说这应该是打印机的唯一ID,而不是空字符串?????
这是一个演示问题的摘录:
#include <QCoreApplication>
#include <QString>
#include <QStringList>
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QPrintDialog>
#include <QtPrintSupport/QPrinterInfo>
#include <QDebug>
#include <QList>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Printer names via availablePrinterNames method";
QStringList name_list = QPrinterInfo::availablePrinterNames();
foreach ( QString name, name_list)
qDebug() << name;
qDebug() << "\nPrinter names via availablePrinters method";
QList<QPrinterInfo> info_list = QPrinterInfo::availablePrinters();
foreach ( QPrinterInfo info, info_list )
qDebug() << info.printerName();
return a.exec();
}
我没有尝试使用早期版本的QT或Windows版本。有人有任何提示吗?
谢谢
简而言之:问题的原因是CUPS支持无驱动打印机(info),而Qt则不支持。
Qt使用CUPS API返回系统中的打印机列表(availablePrinterNames)而不进行检查,但是当它构造QPrinterInfo时,它会检查打印机是否有PPD驱动程序。如果不是,则认为打印机无效,Qt返回空名称。