QT开发: 如何调用TSCLIB库打印本地图片?


QT开发: 如何调用TSCLIB库打印本地图片?

我已经完成了以下代码:
void MainWindow::on_pushButton_clicked()
{
    ui->pushButton->setText("TSC打印测试");
    typedef int (*TSCabout)();
    typedef int (*TSCopenport)(char*);
    typedef int (*TSCsendcommand)(char*);
    typedef int (*TSCcloseport)();
    typedef int (*TSCdownloadpcx)(char*, char*);

    QLibrary tscdll("C:\\TSCLIB.dll");
    if(tscdll.load())
    {
         TSCabout about = reinterpret_cast<TSCabout>(tscdll.resolve("about"));
         TSCopenport openport=reinterpret_cast<TSCopenport>(tscdll.resolve("openport"));
         TSCcloseport closeport=reinterpret_cast<TSCcloseport>(tscdll.resolve("closeport"));
         TSCsendcommand sendcommand=reinterpret_cast<TSCsendcommand>(tscdll.resolve("sendcommand"));
         TSCdownloadpcx downloadpcx = reinterpret_cast<TSCdownloadpcx>(tscdll.resolve("downloadpcx"));

         if(about == nullptr)
         {
             QMessageBox::warning(this, "Error", "Unable to resolve 'about' function");
             return;
         }
         else if(openport==nullptr)
         {
             QMessageBox::warning(this, "Error", "Unable to resolve 'openport' function");
             return;
         }
         else if(closeport==nullptr)
         {
             QMessageBox::warning(this, "Error", "Unable to resolve 'openport' function");
             return;
         }
         else if(sendcommand==nullptr)
         {
             QMessageBox::warning(this, "Error", "Unable to resolve 'openport' function");
             return;
         }
         else if(downloadpcx==nullptr)
         {
             QMessageBox::warning(this, "Error", "Unable to resolve 'downloadpcx' function");
             return;
         }

        char printerName[] = "TSC TTP-243 Pro";
        openport(printerName);
        sendcommand(const_cast<char*>("SIZE 50 mm, 50 mm"));
        sendcommand(const_cast<char*>("GAP 2 mm, 0 mm"));
        sendcommand(const_cast<char*>("DIRECTION 0"));
        sendcommand(const_cast<char*>("CLS"));

        // Download the image to the printer as a PCX file
        QString imagePath = "C:/Users/DELL/Desktop/QT_Sample/combined.png";
        QByteArray imageData;
        QFile imageFile(imagePath);
        if(imageFile.open(QIODevice::ReadOnly))
        {
            qDebug() << "Image file opened successfully";
            imageData = imageFile.readAll();
            imageFile.close();
        }
        else
        {
            qDebug() << "Failed to open image file at path" << imagePath;
            QMessageBox::warning(this, "Error", "Unable to open image file");
            closeport();
            return;
        }

        qDebug() << "Image data size: " << imageData.size();
        qDebug() << "PCX file path: " << "D:/combined.pcx";
        downloadpcx(const_cast<char*>("D:/combined.pcx"), imageData.data());

        // Print the image using the PCX file
        sendcommand(const_cast<char*>("PUTPCX 10,10,\"combined.pcx\""));
        sendcommand(const_cast<char*>("PRINT 1"));

        closeport();
    }
    else
    {
         QMessageBox::warning(this, "Error", tscdll.errorString());
    }
    return;
}

但是在运行到downloadpcx(const_cast<char*>("D:/combined.pcx"), imageData.data());时,就跳出弹窗:Could not open file.
如下如所示:

img

查看了相应路径下的文件,发现downloadpcx函数并没有成功把combined.png转为combined.pcx。 路径下根本没有这个pcx文件。
但是其他的功能都正常,如果只是打印文字,是可以调到TSC打印机打印的。
究竟如何才能用TSC打印PNG图片啊?!怎么解决Could not open file的问题啊?! 求大家指点!

如果对你有启发和帮助,请采纳! 答案参考Chatgpt解答
根据你提供的代码和描述,问题可能出在以下几个地方:

  1. 文件路径问题:你在调用downloadpcx函数时,指定的PCX文件路径为"D:/combined.pcx",但是实际上你后续使用的路径是"C:/Users/DELL/Desktop/QT_Sample/combined.png"。请确保路径的一致性,确保PCX文件的保存路径和读取的PNG文件的路径是一致的。

  2. 文件读取问题:你使用QFile读取PNG文件的代码看起来是正确的,但是你需要确保能够成功读取到PNG文件的数据。你可以在QFile读取之后添加一些调试输出,例如打印imageData.size()的值,以确保数据已经正确读取。

  3. 文件写入问题:downloadpcx函数可能无法将PNG文件转换为PCX文件并保存在指定路径。请确保该函数能够正确执行,并且你有权限在指定路径上进行文件写入。你可以尝试在调用downloadpcx函数之前,手动创建一个空的PCX文件,然后将路径传递给downloadpcx函数,看看是否能够成功写入数据。