Mac 如何拖拽文件到dock上面的icon?(详细)

拖拽文件到dock上面的icon来打开需要两个操作:

1、代码

在AppDelegate.m里面添加delegate函数:

- (void)application:(NSApplication *)theApplication openFiles:(NSArray *)filenames

这个函数会自动被调用。

2、Info.plist

向Info.plist里面添加代码:

<key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>*</string>
            </array>
            <key>CFBundleTypeName</key>
            <string>Folder</string>
            <key>CFBundleTypeOSTypes</key>
            <array>
                <string>****</string>
            </array>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
            <key>LSTypeIsPackage</key>
            <false/>
        </dict>
    </array>

 

一开始我只添加了代码部分,结果不行,最后又添加了Info.plist部分,感觉苹果应该让步骤更简单点,添加代码部分就可以了,为何还要添加Info.plist部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,您可以使用QDrag、QMimeData和QDropEvent来实现将QDockWidget拖拽到另一个QWidget中的功能。 以下是示例代码: ```c++ #include <QApplication> #include <QMainWindow> #include <QWidget> #include <QDockWidget> #include <QDragEnterEvent> #include <QDropEvent> #include <QMimeData> class MyWidget : public QWidget { public: MyWidget(QWidget* parent = nullptr) : QWidget(parent) { // Enable drop events for this widget setAcceptDrops(true); } // Override dragEnterEvent to handle drag enter events void dragEnterEvent(QDragEnterEvent* event) override { // Accept event if it contains a QDockWidget if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->acceptProposedAction(); } } // Override dropEvent to handle drop events void dropEvent(QDropEvent* event) override { // Get the data from the drop event QByteArray data = event->mimeData()->data("application/x-qabstractitemmodeldatalist"); // Create a QDataStream to read the data QDataStream stream(&data, QIODevice::ReadOnly); // Read the data until we find a QDockWidget while (!stream.atEnd()) { int row, col; QMap<int, QVariant> role_data; stream >> row >> col >> role_data; // Check if the role data contains a QDockWidget if (role_data.contains(Qt::UserRole) && role_data[Qt::UserRole].canConvert<QWidget*>()) { // Get the QDockWidget from the role data QWidget* widget = role_data[Qt::UserRole].value<QWidget*>(); // Create a new QDockWidget with the same properties as the original QDockWidget* dock_widget = new QDockWidget(widget->windowTitle(), this); dock_widget->setWidget(widget->parentWidget()); dock_widget->setFeatures(widget->parentWidget()->features()); dock_widget->setAllowedAreas(widget->parentWidget()->allowedAreas()); // Add the new QDockWidget to this widget addDockWidget(Qt::LeftDockWidgetArea, dock_widget); // Accept the drop event event->acceptProposedAction(); return; } } // Reject the drop event if no QDockWidget was found event->ignore(); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); // Create QMainWindow as an intermediary QMainWindow* main_window = new QMainWindow(); // Create MyWidget MyWidget* widget = new MyWidget(main_window); // Create QDockWidget and add it to QMainWindow QDockWidget* dock_widget = new QDockWidget("Dock Widget", main_window); dock_widget->setWidget(new QWidget(dock_widget)); main_window->addDockWidget(Qt::LeftDockWidgetArea, dock_widget); // Set MyWidget as the central widget of QMainWindow main_window->setCentralWidget(widget); // Show QMainWindow main_window->show(); return app.exec(); } ``` 在这个例子中,我们创建了一个名为MyWidget的QWidget子类,并将其设置为QMainWindow的中心窗口。我们启用了该widget的拖放事件,以便可以将QDockWidget拖拽到该widget中。 我们还重载了dragEnterEvent和dropEvent方法,以响应拖放事件。在dragEnterEvent中,我们检查拖动操作是否包含一个QDockWidget,并在包含时接受拖动事件。在dropEvent中,我们从QMimeData中读取数据,直到找到一个QDockWidget。然后,我们使用原始QDockWidget创建一个新的QDockWidget,并将其添加到MyWidget中。 请注意,我们使用了“application/x-qabstractitemmodeldatalist”格式来传输数据。这是因为QDockWidget没有默认的MIME类型。我们将QDockWidget作为Qt::UserRole存储在QMimeData中。 希望这可以帮助您实现将QDockWidget拖拽到另一个QWidget中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值