Qt 在两个 QListWidget 之间拖放

发布于 2024-10-10 09:19:25 字数 938 浏览 5 评论 0原文

我有两个 QListWidget(list1 和 list2)

  • list1 应该能够从 list2 接收项目
  • list1 应该能够使用内部重新组织拖放
  • list2 应该能够从 list1 接收项目,

list1->setSelectionMode(QAbstractItemView::SingleSelection);
list1->setDragEnabled(true);
list1->setDragDropMode(QAbstractItemView::DragDrop);
list1->viewport()->setAcceptDrops(true);
list1->setDropIndicatorShown(true);

ulist2->setSelectionMode(QAbstractItemView::SingleSelection);
list2->setDragEnabled(true);
list2->setDragDropMode(QAbstractItemView::InternalMove);
list2->viewport()->setAcceptDrops(true);
list2->setDropIndicatorShown(true);

我必须将 list2 放在 InternalMove 上,否则当我将项目拖到 list1 时,项目并未被删除。

如果我将 list1 放入 InternalMove 中,我就不能再在上面放任何东西了。

我是否必须编写自己的拖放功能才能做到这一点?

I've two QListWidget (list1 and list2)

  • list1 should be able to receive items from list2
  • list1 should be able to be reorganized with an internal drag and drop
  • list2 should be able to receive items from list1

list1->setSelectionMode(QAbstractItemView::SingleSelection);
list1->setDragEnabled(true);
list1->setDragDropMode(QAbstractItemView::DragDrop);
list1->viewport()->setAcceptDrops(true);
list1->setDropIndicatorShown(true);

ulist2->setSelectionMode(QAbstractItemView::SingleSelection);
list2->setDragEnabled(true);
list2->setDragDropMode(QAbstractItemView::InternalMove);
list2->viewport()->setAcceptDrops(true);
list2->setDropIndicatorShown(true);

I had to put the list2 on InternalMove otherwise the item is not remove when I drag it to the list1.

And if i put list1 to InternalMove i can't drop any more on it.

Do I have to write my own drag and drop function to do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

∞琼窗梦回ˉ 2024-10-17 09:19:25

您可以扩展 QListWidget 覆盖 dragMoveEvent 方法如下所示

#ifndef MYLISTWIDGET_HPP
#define MYLISTWIDGET_HPP

#include <QListWidget>

class MyListWidget : public QListWidget {

public:
    MyListWidget(QWidget * parent) :
        QListWidget(parent) {}

protected:
    void dragMoveEvent(QDragMoveEvent *e) {
        if (e->source() != this) {
            e->accept();
        } else {
            e->ignore();
        }
    }
};

#endif // MYLISTWIDGET_HPP

在我们的实现中,我们检查拖动事件,我们不接受(允许)删除来自我们的小部件本身的项目。
如果您使用 QtDesigner 您可以使用当您右键单击表单上的 QListWidget 时,会从上下文菜单中选择“升级到...”选项。您必须输入新类的名称(在我的示例中为 MyListWidget),并且必须输入新头文件的名称,您的类将在其中声明(您可以复制并粘贴上面的代码到这个文件中)。

You can extend QListWidget overriding dragMoveEvent method like below

#ifndef MYLISTWIDGET_HPP
#define MYLISTWIDGET_HPP

#include <QListWidget>

class MyListWidget : public QListWidget {

public:
    MyListWidget(QWidget * parent) :
        QListWidget(parent) {}

protected:
    void dragMoveEvent(QDragMoveEvent *e) {
        if (e->source() != this) {
            e->accept();
        } else {
            e->ignore();
        }
    }
};

#endif // MYLISTWIDGET_HPP

Inside our implementation we check the source of the drag event and we don't accept (allow) dropping items that come from our widget itself.
If you're using QtDesigner you can use Promote to... option from the context menu when you right click on the QListWidget on your form. You have to enter a name of your new class (MyListWidget in my example) and you have to enter a name of new header file, where your class will be declared (you can copy and paste the code above into this file).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文