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));
次のカードをリストに追加するように指示する信号を送信しますか?
フィードバックありがとう