Determinare contenuto cella di qtablewidget
-
tableWidget->model()->index(riga,colonna).data().type()
ritorna un valore di http://doc.qt.io/qt-5/qmetatype.html#Type-enum -
Grazie VRonin.
Sto tentando di realizzare un programma di aiuto per l'apprendimento del gioco degli scacchi.
Partendo da questa situazione della scacchiera:
devo poter muovere un pezzo degli scacchi, ma non riesco a determinare se la cella ha un pezzo oppure no.
Inserendo le seguenti istruzioni ricevo come risposta sempre zero, sia che muova un pezzo, sia che muova una cella vuota.void Scacchi01::on_Scacchiera_cellEntered(int row, int column) { cout << ui->Scacchiera->model()->index(row, column).data().type() << endl; }
-
ok, ti sei complicato semplicemente molto la vita. Lascia perdere le immagini per il momento.
class Pezzo{ public: enum class Tipo{ Nessuno ,Pedone ,Torre ,Cavallo ,Alfiere ,Regina ,Re }; enum class Colore{ Nessuno,Nero,Bianco }; Tipo tipo; Colore colore; Pezzo() : tipo(Nessuno), colore(Nessuno){} Pezzo(Tipo tp, Colore cl): tipo(tp), colore(cl){} Pezzo(const Pezzo&)=default; }; Q_DECLARE_METATYPE(Pezzo)
ora puoi salvare i pezzi direattamente nel modello e lasciare al delegate il compito di disegnarli
-
Più vado avanti e più faccio mia la frase di Socrate "So solo una cosa, so di non sapere niente".
Dovrei mettermi a studiare, capire cosa significhi e come si usa il concetto di delegate... ma forse non è più il mio tempo.
Mi devo limitare ad utilizzare i metodi che conosco, poco conciliabili con le nuove tecniche, più potenti sicuramente, ma non facili da usare.
Fatta questa premessa...
Ho creato la matrice "int scacchieretrappole [300][144] = {}; // la scacchiera è 12x12 con una doppia cornice di elementi a 55" in cui il primo elemento è così costituito:55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 19 20 21 18 17 22 23 24 55 55 55 55 25 26 27 28 29 30 31 32 55 55 55 55 0 0 0 0 0 0 0 0 55 55 55 55 0 0 0 0 0 0 0 0 55 55 55 55 0 0 0 0 0 0 0 0 55 55 55 55 0 0 0 0 0 0 0 0 55 55 55 55 9 10 11 12 13 14 15 16 55 55 55 55 3 4 5 2 1 6 7 8 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
I numeri da 1 a 32 rappresentano un pezzi degli scacchi, il numero 0 è l'assenza di un pezzo, mentre il numero 55 è la cornice. Ho pensato a questa soluzione (della doppia cornice a 55) perché così mi è facile determinare quando con un movimento si va fuori dalla scacchiera; così anche la mossa del cavallo è una mossa controllabile.
Posto che il n. 1 è il re bianco, il 2 è la donna bianca e così via, ho riportato il contenuto del primo elemento della matrice nella qtablewigdet così:switch (*punt) { case RB: thumbnail->setData(Qt::DecorationRole, QPixmap::fromImage(ImmaginePezzi[1][1])); break; case DB: thumbnail->setData(Qt::DecorationRole, QPixmap::fromImage(ImmaginePezzi[1][2])); break; ... default: thumbnail->setData(Qt::DecorationRole, QPixmap::fromImage(ImmaginePezzi[0][0])); break; } if (*punt != 55) { ui->Scacchiera->setItem(i - 2, j - 2, thumbnail); if ((i + j) % 2 != 0) ui->Scacchiera->item(i - 2, j - 2)->setBackgroundColor(colorescuro); } }
Ora, impostando alcune proprietà della qtablewidget riesco a fare click su un pedone e spostarlo nalla cella sopra, ma questo movimento dovrei poi riportarlo nella matrice di 300 elementi detta prima.
Ma mi mancano principalmente 2 cose:- Quale slot dovrei attivare quando si fa click su una cella affinché possa determinare se la mia matrice contiene un pezzo spostabile;
- Quale slot dovrei attivare quando si lascia depositare il pezzo su un'altra cella (questo mi serve anche per reimpostare correttamente il colore di fondo delle celle di arrivo e partenza).
Posso approfittare della tua pazienza, VRonin, e chiederti quali potrebbero essere gli slots che mi concedono queste cose ?
Ti ringrazio immensamente. -
la parte iniziale della routine che ho esposto sopra è la seguente:
void Scacchi01::elaborapartita(int (*indirizzoscacchiera)) { int *punt = NULL; for (int i = 0; i < 8 + 4; i++) { for (int j = 0; j < 8 + 4; j++) { punt = indirizzoscacchiera + (i * 12) + j; QTableWidgetItem *thumbnail = new QTableWidgetItem; switch (*punt) { case RB: thumbnail->setData(Qt::DecorationRole, QPixmap::fromImage(ImmaginePezzi[1][1])); break; case DB: thumbnail->setData(Qt::DecorationRole, QPixmap::fromImage(ImmaginePezzi[1][2])); break;
-
Spero che questo sia abbastanza per riporatrti sulla retta via senza doverti far ricominciare da 0:
https://bitbucket.org/LBeldi/esempioscacchi/src -
E' bellissimo... ma io ho bisogno di metterci le mani e quindi non posso lasciarlo così com'è senza capire.
Per questo motivo sto tantando di utilizzare una Form Ui come proposto dal QtCreator. Questo soprattutto perché non conosco le varie proprietà da impostare per ogni widget che dovrei generare: sono più che in alto mare, lo so.
Ho tentato di creare sulla mia form di prova una QTableView, che ho chiamato Scacchiera, e da programma sto impostando le varie proprietà come avevi fatto tu. Purtroppo mi dà un errore e non riesco a capire come rimuovere. Eccolo:
Per caso il motivo risiede nel fatto che non si possono impostare alcune proprietà da programma, ma solo col generatore del QtCreator ? -
Se ti puo' aiutare ho finito il programma qui: https://github.com/VSRonin/EsempioScacchi