2013-08-18 53 views
6

私は、iOSインターフェイス、3x3フィールドのアイコンをドラッグして位置を変更してから、XMLファイルでそれを覚えておく必要があります。 Gridクラス(QWidgetは親)をコンテナとして使用し、QWidgetから継承した独自のクラスを要素として使用することにしました。今私はQWidgetのためにドラッグ&ドロップを実行する方法を学ぼうとしていますが、QWidgetにしかドロップできないようですが、ドラッグすることは不可能です。 それは本当ですか、ちょうど私が遅れているのですか?このことをどうやって動かすのですか? xxQTでのQWidgetのドラッグ5

+0

はあなただけ移動するか、yourDragObject->setPixmap();

例えばピックスマップとしてこのwidgetPixmapを使用し、また、QWidgetのをドラッグすることができますトリックを行いますそれをドラッグ・アンド・ドロップするには?ちょうどそれを移動する方が簡単です(http://stackoverflow.com/questions/12219727/dragging-moving-a-qpushbutton-in-pyqt)、ドラッグ/ドロップが複雑になる(http://stackoverflow.com/questions/24582383/qmimedata - 設定 - と - 右のMIMEタイプのための任意のウィジェットを取得)。 – neuronet

答えて

3

ウィジェットをドラッグするのは簡単ではありません。たくさんのコーディングが必要です。 Qt Docsから

void MainWindow::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::LeftButton 
     && iconLabel->geometry().contains(event->pos())) { 

     QDrag *drag = new QDrag(this); 
     QMimeData *mimeData = new QMimeData; 

     mimeData->setText(commentEdit->toPlainText()); 
     drag->setMimeData(mimeData); 
     drag->setPixmap(iconPixmap); 

     Qt::DropAction dropAction = drag->exec(); 
     ... 
    } 
} 

ウィジェットは、例えば、それをドラッグすることでメッセージを受信したときにこれは、意味mousepressのように、QDragオブジェクトを作成する必要があります。

QDragオブジェクトでは、ドラッグされたウィジェットを表すpixmapを設定できます。この時点でウィジェットを非表示にすると、マウスポインタがウィジェットを「取った」ように見えます。

また、QMimeDataオブジェクトが必要です。この中には、あなたのウィジェットを表すあらゆる種類のデータを入れることができます。ユースケースでは、ウィジェットを識別できるようにします。なぜなら、難しい部分が来るからです。あなたは自分自身を動かす必要があります。

グリッドの親であるウィジェットは、ドロップイベントを受け取り、私が移動したいと望むmimeデータから読み取ります。 QDropEventから、ウィジェットが移動されるポイントが取得されます。これはコード化する必要があります:グリッドレイアウトの実際の位置変更。そしてXMLを更新することを忘れないでください。

+0

と私はちょうどどの要素が動いていたかを覚えていますが、他のどの要素がドロップされたのかを覚えておいて、次に2番目の要素を覚えて、最初に置き換えて、addWidget()とremoveWidget() –

+0

@Leonid Bor、QDragオブジェクトは、マウスポインタの下にアイコンを表示する方法を提供します。ドラッグされたオブジェクトに関するデータをドロップレシーバに渡す方法を提供します。この情報を得ることができれば、問題はありません。 addWidget()とremoveWidget()は確かに実際に移動を実行する1つの方法です。 – Greenflow

0

Qt wikiには、80行以下のコードでiOSアイコンインターフェイスをエミュレートする方法に関するQtQuickの例が含まれています。

hereです。

+0

thxだが私の上司はこれを使わないように制限した。/ –

+0

qmlを読んだら、それをQGridLayout/QWidgetレイアウトに翻訳できると思う。結局のところ、qmlはレイアウトを説明する他の言語に過ぎません。 –

3

、あなたは

QPixmap *widgetPixmap = new QPixmap; 
yourWidget->render(widgetPixmap); // rendering the current widget to t_iconTPixmap 

void MainWindow::mousePressEvent(QMouseEvent *event) 
{ 
if (event->button() == Qt::LeftButton 
    && iconLabel->geometry().contains(event->pos())) { 

    QDrag *drag = new QDrag(this); 
    QMimeData *mimeData = new QMimeData; 

    mimeData->setText(commentEdit->toPlainText()); 

    QPixmap *widgetPixmap = new QPixmap; 
    yourWidget->render(widgetPixmap); 

    drag->setMimeData(mimeData); 
    drag->setPixmap(widgetPixmap); 

    Qt::DropAction dropAction = drag->exec(); 
    ... 
    } 
} 
+0

エラーが発生する:非アクティブな画家でレンダリングできない – wutzebaer

関連する問題