2012-10-04 37 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をサブクラス化し、dragイベントで要素のインデックスを取得し、dropイベントで他の要素のインデックスを取得することもできます。したがって、並べ替えの対象と配置場所(2番目の要素のインデックスの前後)を知っています。残りの部分は、takeItem()とinsertItem()だけで簡単にできます。私はこれらの二つの方法であなたを助けた

希望;)win7ので

+0

申し訳ありませんアレクサンダー問題ここに...だったドラッグアンドドロップが、作成されQRectではありません動作しますドラッグアンドドロップをしながら – sobingt

1

は、私は同じ動作を再現することができませんでした。それはちょうど(偶数サイズヒントがあなたのスクリーンショットの要件を満たすために微調整される。:)) 私のテストコードが

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; 
} 
関連する問題