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 です。図 2 では Qrect が作成されていますが、図 4 では作成されていません

4

2 に答える 2

1

次の行を削除してみてください。

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

それらは、「実際の」ドラッグ アンド ドロップ システムに干渉する可能性があります。通常、並べ替えは最適化された方法で処理されます。

別の解決策は、QListWidget をサブクラス化し、ドラッグ イベントで要素のインデックスを取得し、ドロップ イベントで他の要素のインデックスを取得することです。したがって、何を並べ替えるか、どこに配置する必要があるか (2 番目の要素のインデックスの前または後) がわかります。あとは簡単で、takeItem() と insertItem() だけです。

これらの2つの方法であなたを助けてくれることを願っています;)

于 2012-10-09T13:44:55.520 に答える
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 に答える