我正在Qt中创建一个可排序列表。该代码适用于Downward Scroll,但是当我滚动列表后我遇到一些问题时可以获得可拖动的项目。我添加了一些测试用例屏幕截图以便更好地理解
Screen1 http://imageshack.us/a/img13/2791/56842367.png Screen2 http://imageshack.us/a/img819/8662/87542336.png Screen3 http://imageshack.us/a/img24/761/97993758.png Screen4 http://imageshack.us/a/img825/1172/93877106.png
这是测试用例代码
#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。在图2中,Qrect已创建,但未在图4中
答案 0 :(得分:1)
尝试删除这些行:
listWidget->setDragEnabled(true);
listWidget->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->viewport()->setAcceptDrops(true);
他们可能会干扰“真正的”Drag'n'Drop系统。重新排序通常以优化的方式处理。
另一个解决方案可能是你继承QListWidget并在drag事件中获取元素的索引,在drop事件中获取另一个元素的索引。因此,您知道要重新排序的内容以及应该放置的位置(在第二个元素的索引之前或之后)。其余的应该很简单,只需要takeItem()和insertItem()。
希望我用这两种方式帮助你;)
答案 1 :(得分:1)
在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;
}