QListWidget中的InternalMove使项目消失

时间:2015-05-17 20:09:46

标签: c++ qt

我试图在树窗口小部件中拖放工作,以便能够在该窗口小部件内移动项目。我设法使物品可以拖动,但当我松开鼠标按钮时,物品消失了。为了缩小范围,我尝试了以下示例(取自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();
}

当我运行此代码并拖放一些项时,它看起来像这样: dragdrop

为什么删除拖动的项目?我错过了哪些想法?

3 个答案:

答案 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