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,数据库未打开错误

连接 DLL 后出现 QT 5.4 错误

如何在 Qt 5.4 应用程序中包含 QtScript 模块

在 Qt 5.4 上编译 QXmpp 库时出错

QT 5.4 QPrinterInfo::printerName 返回空白

Qt 5.4 - Mac OS X 10.6 支持