qt - QListWidget 向下滚动列表后拖动

标签 qt drag-and-drop qlistwidget

我正在 Qt 中创建一个可排序列表。该代码对于向下滚动效果非常好,但是当我在向下滚动列表后获取可拖动项目时遇到一些问题。我添加了一些测试用例屏幕截图以便更好地理解

Screen1 Screen2 Screen3 Screen4

这是测试用例代码

    #include <QtGui>

   int main(int argc, char **argv) 
   {
      QApplication app(argc, argv);
      QListWidget *listWidget = new QListWidget;
      for(int i=0;i<100;++i){
        listWidget->addItem("SongOne");
        listWidget->addItem("SongTwo");
        listWidget->addItem("SongThree");
        listWidget->addItem("SongFour");
        listWidget->addItem("SongFive");
      }
      listWidget->setDragDropMode(QAbstractItemView::InternalMove);
      listWidget->setDragEnabled(true);
      listWidget->setAcceptDrops(true);
      listWidget->setDropIndicatorShown(true);
      listWidget->viewport()->setAcceptDrops(true);
      listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
      listWidget->show();
      app.exec();
      delete listWidget;
      return 0;
    }

感谢您花时间阅读我的帖子。如果您对我错过的内容有任何提示,请帮助我。我想我错过了设置一些属性。在主程序(不是测试代码)中,我尝试重写 dragMoveEvent 和其他一些方法,但没有用。

这里的问题不是拖放,而是拖放时创建的 QRect。在图二中创建了 Qrect,但在图四中未创建

最佳答案

尝试删除这些行:

listWidget->setDragEnabled(true);
listWidget->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->viewport()->setAcceptDrops(true);

它们可能会干扰“真正的”拖放系统。重新排序通常以优化的方式处理。

另一个解决方案可能是您继承 QListWidget 并在拖动事件中获取该元素的索引,并在放置事件中获取另一个元素的索引。因此您知道要重新排序什么以及应该将其放置在何处(第二个元素的索引之前或之后)。其余的应该很简单,只需 takeItem() 和 insertItem()。

希望我通过这两种方式帮助你;)

关于qt - QListWidget 向下滚动列表后拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12723297/

相关文章:

xml - 如何返回 QDomDocument 中的根元素?

python - 如何使用 QStyledItemDelegate 绘制()

python - 获取 QListWidget 中选定的行

qt - 如何使用 QListWidget 响应内部拖放操作?

c++ - 如何在一个QTableView中显示多个QSqlTableModels的内容?

c++ - QML 通过 id 锚定到 ApplicationWindow 不起作用

java - 拖动时禁用 TreeNode Selection

iPhone 应用程序 : implementation of Drag and drop images in UIView

android - 如何在 Android 中使用拖放来交换两个 ImageView ?

qt - QListWidgetItem 项目相互重叠