QT 5.4 QPrinterInfo::printerName 返回空白
Posted
技术标签:
【中文标题】QT 5.4 QPrinterInfo::printerName 返回空白【英文标题】:QT 5.4 QPrinterInfo::printerName returns blanks 【发布时间】:2015-02-05 20:04:45 【问题描述】:我正在尝试在不使用 QPrintDialog 的情况下实例化打印机,因为我们的 GUI 是 QML,而 QPrintDialog 不存在(我们正在 QML 中创建打印机选择对话框)。我正在调用两个可调用的 C++ 函数 1) 一个函数检索有效打印机列表并将其传递回 QML,2) 第二个函数实例化用户在 QML 中选择的打印机名称,然后打印给画家。我正在使用带有 Qt5.4.0 的 Ubuntu Linux (32)。我发现的一个有趣问题是,当我使用 QPrinterInfo::availablePrinterNames() 时,会找到有效的打印机名称列表。当我通过使用静态函数 QPrinterInfo::availablePrinters() 获取 QPrinterInfo 对象列表,然后遍历列表并在打印机名称中显示名称时,返回一个空字符串。文档说这应该是打印机的唯一 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 版本。有人有什么提示吗?
谢谢
【问题讨论】:
刚刚在 Windows 5.4.0 版本中运行了这个控制台应用程序,它运行良好。在项目文件中还有一个 QT += core printsupport 用于 linux 和 windows 项目文件。 FWIW,我得到了两个函数的相同列表。运行 Gentoo amd64,qt-5.4.0。编译与g++ runme.cpp -I /usr/include/qt5/QtCore/ -I /usr/include/qt5/ -fPIC -lQt5Core -lQt5PrintSupport
无辜的旁观者:感谢您在您的系统上运行。嗯,可能是我的环境。我忘记提及的一个细节是,我在一个适用于 Ubuntu 14.10 的 VMWare VM 中运行,可能是我的 Linux 环境,所以我将尝试在其他一些本地运行的 Linux 机器上(而不是在 VM 中)。
我在 2 台未在 VM 中运行的 Linux 机器上运行此测试程序 - 工作正常,因此我的 VM 或 VM 中的包设置肯定存在问题。
SportPilot,似乎如此。 FWIW,我会尝试重新安装 cups
和相关的 Qt
库。
【参考方案1】:
简而言之:问题的原因是 CUPS 支持无驱动打印机 (info),而 Qt 不支持。
Qt 使用 CUPS API 返回系统中的打印机列表(availablePrinterNames)而不检查,但是当它构造 QPrinterInfo 时,它会检查打印机是否有 PPD 驱动程序。如果不是,则认为打印机无效,Qt 为它返回空名称。
【讨论】:
【参考方案2】:请试试这个,它对我有用。首先,您应该将 windowsprintersupport.dll 添加到您的项目中。
int count = 0;
QList<QPrinterInfo> info_list = QPrinterInfo::availablePrinters();
foreach ( QPrinterInfo info, info_list )
count++;
qDebug()<< "Printer_"<< count<< ": " << info.printerName() << "State: " << info.state();
if(info.printerName() == "YOUR_PRINTER_NAME")
if (info.state() == 0)
qDebug()<< "Printer Idle";
else if (info.state() == 1)
qDebug()<< "Printer Active";
else if (info.state() == 2)
qDebug()<< "Printer Aborted";
else if (info.state() == 3)
qDebug()<< "Printer Error";
else
qDebug()<< "Printer Undefined Error";
【讨论】:
以上是关于QT 5.4 QPrinterInfo::printerName 返回空白的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Qt 5.4 应用程序中包含 QtScript 模块