从Qt

时间:2017-05-04 06:45:15

标签: c++ qt pdf printing qsettings

我发现以下代码片段符合我的期望,但问题是,当PDF文件打开并且用户使用PDF阅读器中的其他打印机打印PDF文件而不关闭PDF阅读器并再次打印我的应用程序中的PDF文件,它将使用PDF阅读器上配置的打印机进行打印,而不是我设置为打印PDF文件的打印机。

示例:

  1. 在应用程序中,我将Printer_1设置为打印PDF文件。
  2. 打印文件(它将在PDF阅读器中打开文件并使用Printer_1打印机打印)。
  3. 在PDF阅读器上,我转到CTRL + P进行打印,然后选择Printer_2并点击打印。
  4. 我没有关闭PDF阅读器并再次关闭应用程序(打印机被选择到Printer_1),我打印PDF文件。现在打印命令被发送到Printer_2而不是Printer_1。
  5. 请问以下代码段中的问题是什么?

    #include <QSettings>
    #include <QProcess>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        const QString classesRoot = "HKEY_CLASSES_ROOT";
    
        // get ID of .pdf extension
        QSettings pdfSettings(classesRoot + "\\.pdf", QSettings::NativeFormat);
        QString pdfId = pdfSettings.value("Default").toString();
    
        // get path to default program that associated with PDF files
        QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\print\\command", QSettings::NativeFormat).value("Default").toString();
        QString openPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\open\\command", QSettings::NativeFormat).value("Default").toString();
        qDebug() << "print path" << printPath;
        qDebug() << "open path" << openPath;
    
        // open .pdf file
        QProcess::startDetached(openPath.arg("full path to pdf file.pdf") );
    
        // print .pdf file
        QProcess printProcess;
        printProcess.start(printPath.arg("full path to pdf file.pdf") );
        printProcess.waitForFinished(-1);
    
        return 0;
    }
    

2 个答案:

答案 0 :(得分:1)

而不是行

QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\printto\\command", QSettings::NativeFormat).value("Default").toString();

使用此功能,所有功能都按预期工作:

static void Ser_uint32_t(uint8_t arr [sizeof(uint32_t)], uint32_t value)
{
    arr[0] = (value >> 24u) & 0xFFu;
    arr[1] = (value >> 16u) & 0xFFu;
    arr[2] = (value >>  8u) & 0xFFu;
    arr[3] = (value >>  0u) & 0xFFu;
}

并传递“filename”,“打印机名称”,“打印机驱动程序”和“端口”[驱动程序名称和端口不是必需的]

答案 1 :(得分:0)

我很抱歉,但我说这看起来似乎是预期的行为:如果应用程序已经打开并且它被设计为不为同一个文件打开单独的实例(就像许多观众那样做,而你的确如此),那么很可能当前的设置(在你的情况下,当前的打印机)也被保留,因为基本上没有任何改变。如果您重新创建步骤但是通过手动打开PDF文件替换程序,我相信您会看到相同的结果。

一个选项是避免打开外部查看器并直接加载PDF文件(当前使用第三方库,例如Poppler)并使用Qt的模块打印它。您可以查看this answer以获取有关它的更多信息。