如何在Swift中自定义QLPreviewPanel右上角按钮并添加复制按钮?
在QLPreviewPanel右上角添加复制按钮的实现方案
要给macOS应用里的QLPreviewPanel右上角加上复制按钮,你需要通过QLPreviewPanelDelegate的方法定制面板工具栏,以下是基于你现有代码的修改方案:
修改后的完整代码
//... let panel = MyQLViewController() panel.previewFile(self, url: url) //... class MyQLViewController: NSViewController, QLPreviewPanelDataSource, QLPreviewPanelDelegate { var url: URL! @objc func previewFile(_ sender: Any, url: URL) { self.url = url if let panel = QLPreviewPanel.shared() { panel.dataSource = self panel.delegate = self panel.makeKeyAndOrderFront(nil) } } override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool { return true } override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) { panel.dataSource = self panel.delegate = self } override func endPreviewPanelControl(_ panel: QLPreviewPanel!) { panel.dataSource = nil panel.delegate = nil } func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int { return 1 } func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! { return self.url as QLPreviewItem } // MARK: - 定制工具栏按钮 func previewPanel(_ panel: QLPreviewPanel!, toolbarItemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier!) -> NSToolbarItem! { if itemIdentifier == NSToolbarItem.Identifier("CopyImageToolbarItem") { let copyItem = NSToolbarItem(itemIdentifier: itemIdentifier) copyItem.label = "复制" // 使用系统自带复制图标,也可替换为自定义图片 copyItem.image = NSImage(systemSymbolName: "doc.on.doc", accessibilityDescription: "复制图片") copyItem.target = self copyItem.action = #selector(copyImage) return copyItem } return nil } func previewPanel(_ panel: QLPreviewPanel!, allowedToolbarItemIdentifiersFor previewItem: QLPreviewItem!) -> [NSToolbarItem.Identifier] { // 配置工具栏项,通过空格和弹性空格将按钮调整到右上角 return [.space, NSToolbarItem.Identifier("CopyImageToolbarItem"), .flexibleSpace] } // MARK: - 复制图片到系统粘贴板 @objc func copyImage() { guard let imageURL = url, let image = NSImage(contentsOf: imageURL) else { print("无法读取目标图片文件") return } let pasteboard = NSPasteboard.general pasteboard.clearContents() pasteboard.writeObjects([image]) } }
关键说明
- 工具栏定制:通过
allowedToolbarItemIdentifiersFor方法告知面板允许使用自定义工具栏项,再通过toolbarItemForItemIdentifier方法创建按钮实例,设置按钮的图标、文字和响应逻辑。 - 复制逻辑:
copyImage方法读取预览的图片文件并写入系统粘贴板,完成复制操作。如果你的预览文件是其他类型,可以根据需求调整复制内容(比如复制文件URL、原始数据等)。
内容的提问来源于stack exchange,提问作者Conan
相关产品推荐
相关产品推荐

