2012-10-04 84 views
5

我在Qt中創建了一個可排序列表。該代碼完美地適用於向下滾動,但是當我在獲得可拖動項目後,我向下滾動列表時出現了一些問題。我添加了一些測試案例截圖更好地理解QListWidget向下滾動列表後拖動

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; 
    } 

Thankz抽出時間閱讀我的文章。如果你對我錯過了什麼有什麼暗示,請幫助我。我想我錯過了設置一些屬性。在主程序(不是測試代碼)中,我嘗試重寫dragMoveEvent以及其他幾種方法,但沒有用。

這裏的問題不是拖放,而是拖放時創建的QRect。在圖二查閱QRect被創建,但不是在圖四

回答

1

嘗試刪除線:

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

可以將它們與「真正的」系統中拖放地干擾。重新排序通常以優化的方式處理。

另一種解決方案可能是您繼承QListWidget並獲取拖動事件中元素的索引以及drop事件中元素的索引。所以你知道要重新排序什麼以及它應該放在哪裏(在第二個元素的索引之前或之後)。剩下的應該很簡單,只需要使用Item()和insertItem()。

希望我幫你用這兩種方式;)

+0

對不起亞歷山大這裏的問題不是拖放但創建查閱QRect同時做拖放 – sobingt

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; 
}