6

我正在 Qt 中创建一个可排序的列表。该代码非常适合向下滚动,但是当我在向下滚动列表后获取可拖动项目时遇到一些问题。我添加了一些测试用例截图以便更好地理解

屏幕1 屏幕2 屏幕3 屏幕4

好吧,这是测试用例代码

    #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,但在图四中没有

4

2 回答 2

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;
}
于 2012-10-15T04:04:28.010 回答
1

尝试删除这些行:

listWidget->setDragEnabled(true);
listWidget->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->viewport()->setAcceptDrops(true);

它们可能会干扰“真正的”拖放系统。重新排序通常以优化的方式处理。

另一种解决方案可能是您将 QListWidget 子类化并在拖动事件中获取元素的索引,并在放置事件中获取其他元素的索引。所以你知道要重新排序什么以及它应该放在哪里(在第二个元素的索引之前或之后)。其余的应该很简单,只需 takeItem() 和 insertItem()。

希望我在这两种方式上对您有所帮助;)

于 2012-10-09T13:44:55.520 回答