2010-11-30 20 views
2

J'ai créé une classe qui hérite de QListWidget et qui est censée être une pile de cartes.Rendre QListWidget uniquement afficher 1 élément

J'ai surchargé les fonctions de glisser-déposer pour permettre à une carte d'être déplacée vers la table (un autre objet de mon programme) et maintenant je trébuche sur un autre problème. Le QListWidget montre tous mes articles (principalement parce que je les ai ajoutés à l'interface graphique depuis le début).

Voici comment ça se passe: dans mon mainwindow J'initialise mon objet CardPile et le remplis d'un vecteur de cartes mélangées.

Maintenant je veux que mon QListWidget n'en montre qu'un seul (mais il montre une grille avec toutes mes cartes).

Sur une goutte, je retire l'élément de mon QListWidget. Mais je ne sais pas si je devais ajouter et retirer 1 carte à la fois (donc ça ne montre qu'une carte de cours) dans mon code.

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 

Voici les fonctions de mon CardPile: QListWidget.

donc:

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? 
} 

Parce que j'ai actuellement mon vecteur de cartes mélangées dans la fenêtre principale (où ajouter toutes les cartes dans un forloop).

Ou devrais-je faire un signal et une fente qui se connectent entre mainwindow et CardPile - donc quand

delete takeItem(row(item)); 

est appelé I émettre un signal qui dit d'ajouter la carte à côté de la liste?

Merci pour commentaires

Répondre

2

Vous pouvez utiliser un QStackWiget (la première ligne du Desription est exactement ce que vous voulez ahieve) au lieu d'un QListWidget.

+0

Oui, j'ai réfléchi à ça. mais à l'intérieur de ce widget, j'utilise QListWidgetItem pour remplir le listWidget. puis-je remplir le QStackedWidget avec ceux-là aussi? – TheDudeAbides

+0

Vous ne pouvez pas accéder à la liste des widgets, mais vous pouvez accéder à tous les widgets par index, donc je suppose que oui –