【问题标题】:Qt drag and drop between two QListWidgetQt在两个QListWidget之间拖放
【发布时间】:2011-06-03 06:40:15
【问题描述】:

我有两个 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 上,我就不能再继续下去了。

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

【问题讨论】:

    标签: qt drag-and-drop qlistwidget


    【解决方案1】:

    您可以扩展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 时从上下文菜单中使用Promote to... 选项。您必须输入新类的名称(在我的示例中为MyListWidget),并且您必须输入新头文件的名称,您的类将在其中声明(您可以将上面的代码复制并粘贴到此文件中)。

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      相关资源
      最近更新 更多