7

iOS インターフェイスのようなものを作成し、ドラッグして位置を変更できるアイコンの 3x3 フィールドを作成し、それを XML ファイルに保存する必要があります。

Grid クラス (QWidget が親) をコンテナーとして使用し、QWidget から継承した独自のクラスを要素として使用することにしました。

今、QWidget のドラッグ アンド ドロップを実行する方法を学ぼうとしていますが、QWidget にドロップすることしかできないようですが、ドラッグすることはできません。

無理ですか?これどうやって動かせばいいの?

4

3 に答える 3

6

ウィジェットのドラッグはそれほど簡単ではありません。自分でやらなければならないコーディングがたくさんあります。

Qtドキュメントから:

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();
        ...
    }
}

つまり、ウィジェットがドラッグするメッセージを受け取った場合 (マウスを押した場合など)、ウィジェットは QDrag オブジェクトを作成する必要があります。

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

さらに、QMimeData オブジェクトが必要です。これには、ウィジェットを説明するあらゆる種類のデータを入れることができます。ユースケースでは、ウィジェットを識別できるもの。なぜなら、ここに難しい部分があるからです:あなたは自分で動かさなければなりません.

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

于 2013-08-18T14:48:27.580 に答える
4

トリックを行うと、QWidget もドラッグできます。

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

これwidgetPixmapをピックスマップとして使用しますyourDragObject->setPixmap();

例、

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();
    ...
   }
}
于 2015-02-18T03:32:54.780 に答える