2

QListWidget を継承し、カードのスタックを意図したクラスを作成しました。

カードをテーブル (プログラムの別のオブジェクト) にドラッグできるように、ドラッグ アンド ドロップ機能をオーバーロードしましたが、別の問題に遭遇しました。

QListWidget にはすべてのアイテムが表示されます (主に、最初から GUI に追加したためです)。

メインウィンドウで CardPile オブジェクトを初期化し、シャッフルされたカードのベクトルで埋めます。

ここで、QListWidget に 1 つだけを表示させたい (ただし、すべてのカードを含むグリッドを表示する)。

ドロップすると、QListWidget からアイテムを削除します。しかし、コードで一度に 1 枚のカードを追加および削除する必要があるかどうかはわかりません (そのため、もちろん 1 枚のカードしか表示されません)。

public:
    TileStack(QWidget *parent = 0);
    void addCard(QPixmap pixmap, QPoint location);
    QPixmap showCard();

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void startDrag(Qt::DropActions supportedActions); //in this function I remove the current item

これらは私の CardPile の関数です: QListWidget.

それで:

void TileStack::startDrag(Qt::DropActions /*supportedActions*/)
{
    QListWidgetItem *item = currentItem();

    QByteArray itemData;
    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    QPixmap pixmap = qVariantValue<QPixmap>(item->data(Qt::UserRole));
    QPoint location = item->data(Qt::UserRole+1).toPoint();

    dataStream << pixmap << location;

    QMimeData *mimeData = new QMimeData;
    mimeData->setData("card", itemData);

    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    drag->setHotSpot(QPoint(pixmap.width()/2, pixmap.height()/2));
    drag->setPixmap(pixmap);

    if (drag->exec(Qt::MoveAction) == Qt::MoveAction)
        delete takeItem(row(item));
    //should I also make the add to the next item here? and how exactly should I put it     here?
}

現在、シャッフルされたカードのベクトルがメインウィンドウにあるためです (すべてのカードを forloop に追加します)。

または、mainwindow と CardPile の間を接続するシグナルとスロットを作成する必要があります。

delete takeItem(row(item));

次のカードをリストに追加するように指示する信号を送信しますか?

フィードバックありがとう

4

1 に答える 1

2

QStackWigetQListWidget の代わりに (説明の最初の行はまさにあなたが達成したいものです) を使用できます。

于 2010-11-30T23:43:44.783 に答える