QListWidget Drag after scrolling down the list
我正在Qt中创建一个可排序列表。该代码对于"向下滚动"效果非常好,但是当我向下滚动列表后遇到一些可拖动项的问题时。我添加了一些测试用例屏幕截图,以更好地理解
这是测试用例代码
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; } |
感谢您抽出宝贵的时间阅读我的帖子。如果您对我缺少的内容有任何提示,请务必帮助我。我认为我缺少设置某些属性的信息。在主程序(不是测试代码)中,我尝试重写
这里的问题不是拖放,而是拖放时创建的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()。
希望我能通过这两种方式帮助您;)