QListWidget 向下滚动列表后拖动
Posted
技术标签:
【中文标题】QListWidget 向下滚动列表后拖动【英文标题】:QListWidget Drag after scrolling down the list 【发布时间】:2012-09-25 06:07:03 【问题描述】:我正在 Qt 中创建一个可排序列表。该代码非常适合向下滚动,但是当我在向下滚动列表后获取可拖动项目时遇到一些问题。我添加了一些测试用例截图以便更好地理解
这是测试用例代码
#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,但在图四中没有
【问题讨论】:
【参考方案1】:尝试删除这些线条:
listWidget->setDragEnabled(true);
listWidget->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->viewport()->setAcceptDrops(true);
它们可能会干扰“真正的”拖放系统。重新排序通常以优化的方式处理。
另一种解决方案可能是您将 QListWidget 子类化并在拖动事件中获取元素的索引,并在放置事件中获取其他元素的索引。所以你知道要重新排序什么以及它应该放在哪里(在第二个元素的索引之前或之后)。其余的应该很简单,只需 takeItem() 和 insertItem()。
希望我在这两种方式上对你有所帮助;)
【讨论】:
抱歉 Alexander,这里的问题不是拖放,而是在拖放时创建的 QRect【参考方案2】:在 win7 中,我无法重现相同的行为。它可以正常工作(甚至调整大小提示以满足您的屏幕截图要求。:)) 我的测试代码是...
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;
【讨论】:
以上是关于QListWidget 向下滚动列表后拖动的主要内容,如果未能解决你的问题,请参考以下文章
在单击+拖动时禁用 QListWidget 中的自动选择项目
在PyQt5中的QTreeWidget和QListWidget之间拖动项目?
Android:向上滚动时显示工具栏(向上拖动),向下滚动时隐藏(向下拖动)