- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个 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 video 和 this 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/
我有一个代理类,它接收请求并将请求发送到另一台服务器,获取响应并将其定向回原始请求者。我使用套接字连接到服务器并使用 Printwriter 对其进行写入。像这样的事情 private Pri
我想使用 Java Swing 为医疗商店开发一个独立的应用程序。强制要求在没有打印对话框的情况下单击一下即可打印小尺寸(219 毫米至 140 毫米)的纸张。他们需要间歇性地将报告从不同的打印机打印
我是一名学生,需要创建一个 silten 打印功能,希望能够打印 PDF。这个需要基于Java。 我在 Google 上搜索并找到了一个无需对话框即可打印的代码。但如果源是 .txt 文件,它就会正确
我正在寻找 POS 打印的解决方案。 场景是: 一家餐厅目前有一个 POS 系统启动并运行,他们从店内的 iPad 上接受订单,并有一个网络设置来处理订单并在厨房的热敏打印机上自动打印出来(很酷,对吧
尝试使用以下代码示例,它在 WinForm 应用程序中运行良好,但在 VSTO 中运行不佳。是否有某种允许访问的权限? 可以设置默认打印机,但不能获取或设置打印机设置。 从插件中获取以下异常: Sys
我必须通过蓝牙将字体文件发送到我的打印机 Zebra RW420。我正在使用 Zebra Windows Mobile SDK,但无法找到任何方式将其发送和存储在打印机上。我可以通过 Label Vi
我需要创建一个“粉碎”的虚拟打印机 基本上这是我的问题。我有一个软件程序需要在保存文件之前“打印”文件。我希望能够打印到我的碎纸机,以便它保存文档,但实际上我不想打印文档。所以我需要打印到一个程序,该
我在吃 Argox 标签打印机时遇到了麻烦,只是仍然无法向她发送任何内容。型号为 Argox OS214 tt,ANPP,接受 PPLB。 使用通用类连接串行设备,我将她用于多个财务打印机和秤,附后。
我正在编写一些在 org.eclipse.swt.printing.Printer 上打印的代码。所以第一步是看看我如何测试它,但似乎架构不允许我定义自己的打印机,因为 PrinterData 和 P
我有一个标签列表,数据如下。 ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param', 'place_effort'][1,
我正在开发一个应用程序,在该应用程序中,我通过 IP 地址和端口号从我的手机向 WiFi 打印机发送文件,这些文件是 .txt、.png、.jpg、.doc。它们应该从打印机打印出来。我尝试了以下代码
我正在尝试使用以下代码打印图像,但文档只是停留在打印作业队列中,拒绝打印。在 (windows) 打印作业队列中,我得到: DocumentName: Printing an image Status
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Print preview ZPL II commands using .NET WinForm befor
我有什么 我目前正在编写一个程序,它接受一个指定的文件并对其执行一些操作。目前它打开它,和/或将它附加到电子邮件并将其邮寄到指定地址。 文件可以是以下格式:Excel、Excel Report、Wor
我将这台 Zebra ZM400 打印机连接到网络 (192.168.1.50)。我正在尝试直接从 PHP 将内容推送到这台打印机。 这就是我的想法,但我无法做到这一点。我尝试了 file_put_c
我想显示一个列表,其中包含设备可通过 AirPrint 访问的所有打印机。 我使用 UIPrinterPickerController 让它工作。 是否有以自定义方式显示此 PickerControl
我想将任何办公文件传输到 Wi-ifi 打印机。我完全不知道如何开始。 发现没有用于无线打印的公共(public) API。 谁能分享一些意见? 提前致谢! 最佳答案 您可以首先扫描 WiFi 设备并
有什么方法可以让我在蓝牙热敏打印机上打印收据,因为我真的很难在 flutter 上找到解决方案?任何事情都有帮助,我真的很感激这些答案 最佳答案 我试过 esc_pos_bluetooth 包,但它不
为了在我的 mac 上模拟 ZPL 打印机,我在互联网上搜索了几天。最后,我有一个解决方案可以在这里发布,这样其他用户可能会发现它有帮助。我想在这里发布我的解决方案 Emulate Zebra pri
是否有 ZPL 命令来简单地重启 Zebra 打印机?到目前为止,我只能找到 ~JR 命令,这对我来说看起来不像我正在寻找的东西。我只需要一种方法来重新启动打印机,而无需重置其任何配置。 最佳答案 以
我是一名优秀的程序员,十分优秀!