【问题标题】:QT 5.4 QPrinterInfo::printerName returns blanksQT 5.4 QPrinterInfo::printerName 返回空白
【发布时间】: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 库。

标签: c++ linux qt printing


【解决方案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";
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 2011-05-27
      • 2012-09-06
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多