gpt4 book ai didi

iOS 打印到网络上的打印机

转载 作者:行者123 更新时间:2023-11-29 11:42:41 24 4
gpt4 key购买 nike

我正在尝试制作一个 iOS 应用程序,它可以“自动”将图片打印到网络上的打印机。我是 iOS 和 Qt 的新手,但到目前为止我还无法找到如何进行打印。我找到了一些示例,向我展示了如何使用 bonjour ( https://doc.qt.io/archives/qq/qq23-bonjour.html ),我想我或多或少可以像这样找到我的打印机,但到目前为止我找不到任何关于如何使用 QPrinter 自动连接到它的帮助打印机。到目前为止,我的代码基本上是:

QPrinter printer;
printer.setOutputFormat(QPrinter::NativeFormat);
printer.setPrinterName("Canon SELPHY CP1200");
QPainter painter;
if(!painter.begin(&printer))
{
//failed, we actually hit this at the moment
return 1;
}
painter.drawText(10, 10, "Test !");
painter.end();

我认为问题是我需要以某种方式将设备连接到我的 Canon 打印机,但我不知道该怎么做。任何见解将不胜感激:)

干杯!

最佳答案

即使 Qt 的文档声明其打印 API 可在所有平台上运行,请参阅例如Qt print support ,它似乎不适用于 iOS。相反,您似乎需要寻求 UIPrintInteractionController 解决方案。这很容易做到。让我为您提供一个简单的例子。让我假设您选择 Qt 是因为您希望您的应用程序是可移植的,并且您有一个专门的类 PrinterManager 来处理框架中的打印:

// this is PrinterManager.hpp
class PrinterManagerImpl;

class PrinterManager : public QObject
{
Q_OBJECT

public:
PrinterManager(QObject* a_Parent = Q_NULLPTR);
virtual ~PrinterManager();

Q_INVOKABLE void setupPrinter();
Q_INVOKABLE void print(const QString& a_PathToImg) const;

private:
Q_DISABLE_COPY(PrinterManager)

private:
std::unique_ptr<PrinterManagerImpl> m_Impl;
};

连同以下实现:

// this is PrinterManager.cpp
#include "PrinterManager.hpp"
#include "PrinterManagerImpl.hpp"

#ifndef Q_OS_IOS
PrinterManager::PrinterManager(QObject* a_Parent)
: QObject(a_Parent)
, m_Impl(new MyStandardPrinterManagerImpl) // implementation for any case except iOS
{ }
#endif

PrinterManager::~PrinterManager()
{ }

void PrinterManager::setupPrinter()
{
m_Impl->setupPrinter();
}

void PrinterManager::print(const QString& a_PathToImg) const
{
m_Impl->print(a_PathToImg);
}

这样指定,PrinterManager 可以很容易地在 QML 中使用。

整个技巧在于使用 PIMPL 习惯用法编写您的 PrinterManager,即将您的类实现封装在成员 m_Impl 中。然后,根据您为其编译代码的平台,您将提供任何必要的 PrinterManagerImpl。

除了上面的 PrinterManager 实现(cpp 文件),您还需要定义以下 mm 文件(用于 objective-c++ 代码),其中包含 PrinterManager 构造函数的 ios 特定实现:

// this is PrinterManager.mm
#import "PrinterManager.hpp"
#import "IosPrinterManagerImpl.hpp"

PrinterManager::PrinterManager(QObject* a_Parent)
: QObject(a_Parent)
, m_Impl(new IosPrinterManagerImpl()) // special iOS implementation
{ }

当您编译此代码时,mm 和 cpp 文件都会被考虑(如果您在项目的 .pro 文件中遵循以下建议)。当您为 iOS 编译它时,在 cpp 文件中找不到构造函数实现。在我们定义 IosPrinterManagerImpl 的 mm 文件中可以找到一个实现。让我们看一下 PrinterManagerImpl:

// this is PrinterManagerImpl.hpp
class PrinterManagerImpl
{
public:
PrinterManagerImpl() { }
virtual ~PrinterManagerImpl() { }

virtual void setupPrinter() = 0;
virtual void print(const QString& a_PathToImg) const = 0;

private:
Q_DISABLE_COPY(PrinterManagerImpl)
};

IosPrinterManagerImpl 看起来像这样(灵感来自 this videothis advice 的末尾):

// IosPrinterManagerImpl.hpp
#import "PrinterManagerImpl.hpp"
#import <UIKit/UIPrinter.h>

class QWidget;

class IosPrinterManagerImpl : public PrinterManagerImpl
{
public:
IosPrinterManagerImpl();
virtual ~IosPrinterManagerImpl();

virtual void setupPrinter() override;
virtual void print(const QString& a_PathToImg) const override;

private:
UIPrinter* m_Printer;
QWidget* m_Dialog;
};

它的实现是

// IosPrinterManagerImpl.mm
#import "IosPrinterManagerImpl.hpp"

#import <QApplication>
#import <QWidget>
#import <QWindow>

#import <UIKit/UIPrinterPickerController.h>
#import <UIKit/UIPrintInteractionController.h>
#import <UIKit/UIPrintInfo.h>

IosPrinterManagerImpl::IosPrinterManagerImpl()
: PrinterManagerImpl()
, m_Dialog(new QWidget(QApplication::activeWindow()))
{
m_Dialog->setGeometry(0, 0, 100, 100);
}

IosPrinterManagerImpl::~IosPrinterManagerImpl()
{ }

void IosPrinterManagerImpl::setupPrinter()
{
// this displays an UI where you can select the printer you want from your local network
auto picker = [UIPrinterPickerController printerPickerControllerWithInitiallySelectedPrinter:m_Printer];

if(auto view = reinterpret_cast<UIView*>(m_Dialog->window()->winId()))
{
[picker presentFromRect:view.bounds inView:view animated:YES
completionHandler:^(UIPrinterPickerController* controller, BOOL userDidSelect, NSError* /*err*/)
{
if(userDidSelect)
{
m_Printer = controller.selectedPrinter;
}
}

];
}
}

void IosPrinterManagerImpl::print(const QString& a_PathToImg) const
{
auto printInfo([UIPrintInfo printInfo]);
printInfo.jobName = @"Test";
printInfo.outputType = UIPrintInfoOutputPhoto;

auto imgUrl([NSURL fileURLWithPath:a_PathToImg.toNSString()]);
auto canPrint([UIPrintInteractionController canPrintURL: imgUrl]);

auto controller = [UIPrintInteractionController sharedPrintController];
if(controller && canPrint)
{
controller.printInfo = printInfo;
controller.printingItem = imgUrl;
// this allows your app to directly print to the selected printer
[controller printToPrinter: m_Printer
completionHandler: ^(UIPrintInteractionController* /*printCtrl*/, BOOL completed, NSError* err)
{
if(completed && !err)
{
qInfo() << "Print successful";
}
}];
}
}

在您的pro文件中,您需要按以下方式添加上述objective-c++文件:

ios {
OBJECTIVE_SOURCES += $${PRINTERMANAGER_FOLDER}/PrinterManager.mm \
$${PRINTERMANAGER_FOLDER}/IosPrinterManagerImpl.mm \
$${PRINTERMANAGER_FOLDER}/IosPrinterManagerImpl.hpp
}

我不是专业的 Objective-C++ 代码编写者。例如,我非常确定您可以以更巧妙的方式将在 setupPrinter() 方法中创建的打印机选择器小部件集成到您的 Qt GUI 中。但是,这段代码可能会解决您的问题......

关于iOS 打印到网络上的打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45592322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com