2010-12-27 7 views
1

ドラッグアンドドロップで並べ替えることのできるカスタムアイテムでQListWidgetを実装する際に問題があります。問題は、アイテム上で高速ダブルクリック(非常に短いドラッグ&ドロップ)を行うと、アイテムがQListWidgetから消えることがあることです。QListWidget Symbian上のリストからアイテムがドラッグアンドドロップされる

これは私のウィジェットのコンストラクタです。また

ListPopisiDragDrop::ListPopisiDragDrop(QWidget *parent) : 
    QListWidget(parent) 
{ 
    setSelectionMode(QAbstractItemView::SingleSelection); 
    setDragEnabled(true); 
    viewport()->setAcceptDrops(true); 
    setDefaultDropAction(Qt::MoveAction); 
    setDropIndicatorShown(true); 
    setDragDropMode(QAbstractItemView::InternalMove); 
} 

ドロップイベント:

void ListPopisiDragDrop::dropEvent(QDropEvent *event){ 

    int startRow=currentIndex().row(); 

    QListWidget::dropEvent(event); 

    int endRow=currentIndex().row(); 

    //more code... 
} 

カスタム項目がQAbstractItemDelegateから(ペイントを実装することにより製)とのsizehint()関数です。

消えるアイテムの問題が発生すると、dropEventは呼び出されません。

私は本当に何が起こっているのか、私が何か間違っているのか分かりません。どんな助けもありがとうございます。

ありがとうございます!

編集: 私はSymbian S60 5th Editionの携帯電話でアプリケーションを実行しています。私は、コンストラクタに次の行を追加した場合 :

EDIT2は

setDragDropOverwriteMode(true); 

項目をリストにまだ消えますが、空の行は、それの場所にとどまります。

EDIT3: 私は何が起こっているかを確認するには、このコードを追加しました:

bool ListPopisiDragDrop::event(QEvent *e){ 
    qDebug()<<"new event, type: "<<e->type()<<", listCount: "<<this->count(); 

    QListWidget::event(e); 
} 

私はまた、ドロップイベントが呼び出されたときに「イベントをドロップ」印刷しました。あなたがイベントタイプ68、2から1へlistCountの変更(1つのアイテムが消える)した後、見ることができるように

... 
[Qt Message] new event, type: 12 , listCount: 2 
[Qt Message] new event, type: 12 , listCount: 2 
[Qt Message] new event, type: 68 , listCount: 2 
[Qt Message] DROPEVENT 
[Qt Message] new event, type: 71 , listCount: 2 
[Qt Message] new event, type: 12 , listCount: 2 
[Qt Message] new event, type: 12 , listCount: 2 
[Qt Message] new event, type: 68 , listCount: 2 
[Qt Message] DROPEVENT 
[Qt Message] new event, type: 71 , listCount: 2 
[Qt Message] new event, type: 12 , listCount: 2 
[Qt Message] new event, type: 12 , listCount: 2 
[Qt Message] new event, type: 12 , listCount: 2 
[Qt Message] new event, type: 68 , listCount: 2 
[Qt Message] new event, type: 12 , listCount: 1 
[Qt Message] new event, type: 12 , listCount: 1 
[Qt Message] new event, type: 1 , listCount: 1 
... 

:これは私に次のような出力を提供します。私はまだどこに問題があるのか​​は分かりません...

Edit4: 私はカスタムアイテムを使用していなくても同じ動作をしています。まだ何が間違っているか把握することはできません。

Edit5: [1]の例でも、モバイルデバイスでテストしたときの動作は同じです。 Qtバージョンが問題になることはありますか?私は... Symbianデバイスバージョン4.6.3用のQtを使用してい

[1] http://www.java2s.com/Code/Cpp/Qt/QListWidgetdraganddrop.htm

+0

68 = ChildAdded、71 = ChildRemoved、12 =ペイント、1 =タイマー – hmuelner

答えて

1

私は2考えることができますこの動作の理由:信号itemDoubleClickedはあなたのQListWidgetのどこかで処理され、何かunintendetを実行するか、sourceとdestinationが同じ場合にdropEventの "more code"が悪いことをします(startRowがendRowと等しいかどうかをチェックして何もしませんこの場合)。

編集:

はあなたのために、このプログラムの作業を行います。3つ星で

#include <QApplication> 
#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(); 
} 

行を削除することができます。このプログラムはWindows XPでVS2010でコンパイルされたQt 4.7.1で動作します。

+0

お返事ありがとうございます。 itemDoubleClickedシグナルを処理していますが、どこでも何も削除しません。また、問題が発生したときにitemDoubleClickedは呼び出されず、dropEventもトリガーされません。 startRowとendRowが等しい場合は何もしません...私の質問は1分でさらに編集します。 – ppalasek

+0

はい、私のように、このプログラムはコンピュータ上で正常に動作しますが、どちらも携帯電話で実行するとこの奇妙な動作をします。私はQt 4.7.1にアップデートしようとしています – ppalasek

+0

Qt 4.7.1を使っても同じです... – ppalasek

1

デスクトップと同じ問題がSelectionMode、InternalMoveなどと同じように表示されます。また、ビューのための私自身のモデルを持っていたので、私はちょうどそれがそのように返す作っ:

Qt::ItemFlags MyModel::flags(const QModelIndex& index) const 
{ 
    if (index.isValid()) 
     return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; 

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled; 
} 

は私と一緒にうまく働きました。

関連する問題