关于qt:QListWidget向下滚动列表后拖动

QListWidget Drag after scrolling down the list

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

Screen1

Screen2

Screen3

Screen4

这是测试用例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    #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,但在图四中未创建


在win7中,我无法重现相同的行为。它只是有效(甚至调整了大小提示来满足您的屏幕快照要求。:))
我的测试代码是...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QListWidget *listWidget = new QListWidget;
    const char* titles[] =  {
       "SongOne%1",
       "SongTwo%1",
       "SongThree%1",
       "SongFour%1",
       "SongFive%1",
    };
    for(int i=0;i<100;++i){
        QString title = QString(titles[i%5]).arg(i);
        QListWidgetItem* item = new QListWidgetItem(title);
        item->setData(Qt::SizeHintRole, QSize(50,100));
        listWidget->addItem(item);
    }
    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;
}

尝试删除以下行:

1
2
3
4
listWidget->setDragEnabled(true);
listWidget->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->viewport()->setAcceptDrops(true);

它们可能会干扰"真实的" Drag'n'Drop系统。重新排序通常以优化的方式进行。

另一种解决方案是您将QListWidget子类化,并在drag事件中获取元素的索引,在drop事件中获取另一个元素的索引。因此,您知道要重新排序的内容以及应将其放置在何处(第二个元素的索引之前或之后)。其余的应该很容易,只要是takeItem()和insertItem()。

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