我试图在树窗口小部件中拖放工作,以便能够在该窗口小部件内移动项目。我设法使物品可以拖动,但当我松开鼠标按钮时,物品消失了。为了缩小范围,我尝试了以下示例(取自SO上的另一篇文章),该问题与Windows 7中Qt 5.4中的树窗口小部件具有相同的问题:
#include <QListWidget>
int main(int argc, char **argv)
{
QApplication a(argc, argv);
QListWidget lw;
for(int i = 1; i < 10; ++i)
lw.addItem(new QListWidgetItem(QString("Item %1").arg(i)));
lw.setDragEnabled(true); // ***
lw.viewport()->setAcceptDrops(true); // ***
lw.setDefaultDropAction(Qt::MoveAction); // ***
lw.setDropIndicatorShown(true); // ***
lw.setDragDropMode(QAbstractItemView::InternalMove);
lw.show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
a.exec();
}
当我运行此代码并拖放一些项时,它看起来像这样:
为什么删除拖动的项目?我错过了哪些想法?
答案 0 :(得分:3)
它是Qt 5.4.1中的bug,您的代码在Qt 4.8.6上正常运行
答案 1 :(得分:3)
我在代码中更改了一行:
lw.setDefaultDropAction(Qt::TargetMoveAction);
现在它工作正常(Qt 5.4.1 Windows 8,Visual Studio 2013)。
答案 2 :(得分:0)
在Qt 5.10或更高版本中,您必须调用“ setMovement(QListView :: Free)”
myList->setDragDropMode(QAbstractItemView::InternalMove);
myList->setDefaultDropAction(Qt::TargetMoveAction);
#if QT_VERSION >= QT_VERSION_CHECK(5,10,0)
myList->setMovement(QListView::Free);
#endif