You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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])
    }
}

关键说明

  1. 工具栏定制:通过allowedToolbarItemIdentifiersFor方法告知面板允许使用自定义工具栏项,再通过toolbarItemForItemIdentifier方法创建按钮实例,设置按钮的图标、文字和响应逻辑。
  2. 复制逻辑:copyImage方法读取预览的图片文件并写入系统粘贴板,完成复制操作。如果你的预览文件是其他类型,可以根据需求调整复制内容(比如复制文件URL、原始数据等)。

内容的提问来源于stack exchange,提问作者Conan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:50:33