Сделать так, чтобы QListWidget показывал только 1 элемент - PullRequest
2 голосов
/ 01 декабря 2010

Я создал класс, который наследует QListWidget и должен быть стеком карт.

Я перегрузил функции перетаскивания, чтобы можно было перетаскивать карту на стол (еще один объект моей программы), и теперь я сталкиваюсь с другой проблемой.

QListWidget показывает все мои элементы (в основном потому, что я добавляю их в графический интерфейс с самого начала).

Так вот как это происходит: в моем главном окне я инициализирую свой объект CardPile и заполняю его перемешанным вектором карточек.

Теперь я хочу, чтобы мой QListWidget показывал только один (но он показывает сетку со всеми моими картами).

По капле я удаляю элемент из моего 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?
}

Потому что у меня в настоящее время мой вектор перемешанных карт в главном окне (где я добавляю все карты в цикле).

Или я должен сделать сигнал и слот, которые соединяются между mainwindow и CardPile - так, когда

delete takeItem(row(item));

вызывается ли сигнал, который говорит добавить следующую карту в список?

Спасибо за отзыв

1 Ответ

2 голосов
/ 01 декабря 2010

Вы можете использовать QStackWiget (первая строка описания - именно то, что вы хотите достичь) вместо QListWidget.

...