Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Determinare contenuto cella di qtablewidget
Forum Updated to NodeBB v4.3 + New Features

Determinare contenuto cella di qtablewidget

Scheduled Pinned Locked Moved Solved Italian
15 Posts 2 Posters 4.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    bvox123
    wrote on last edited by
    #1

    Buongiorno.
    Mi dite come posso fare per determinare cosa contiene una cella di un qtablewidget ? Mi basta anche ricavare la dimensione del contenuto perché da questo posso capire se c'è un'immagine o un testo.
    Grazie.

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2

      tableWidget->model()->index(riga,colonna).data().type() ritorna un valore di http://doc.qt.io/qt-5/qmetatype.html#Type-enum

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      0
      • B Offline
        B Offline
        bvox123
        wrote on last edited by
        #3

        Grazie VRonin.
        Sto tentando di realizzare un programma di aiuto per l'apprendimento del gioco degli scacchi.
        Partendo da questa situazione della scacchiera:
        0_1520505925992_Schermata del 2018-03-08 11-42-05.png
        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;
        }
        
        
        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #4

          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

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          0
          • B Offline
            B Offline
            bvox123
            wrote on last edited by
            #5

            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:

            1. Quale slot dovrei attivare quando si fa click su una cella affinché possa determinare se la mia matrice contiene un pezzo spostabile;
            2. 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.

            1 Reply Last reply
            0
            • VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #6

              Non mi e' chiaro come tu connetta la matrice al QTableWidget

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              1 Reply Last reply
              0
              • B Offline
                B Offline
                bvox123
                wrote on last edited by
                #7

                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;
                
                
                1 Reply Last reply
                0
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by
                  #8

                  Spero che questo sia abbastanza per riporatrti sulla retta via senza doverti far ricominciare da 0:
                  https://bitbucket.org/LBeldi/esempioscacchi/src

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  1 Reply Last reply
                  0
                  • B Offline
                    B Offline
                    bvox123
                    wrote on last edited by
                    #9

                    Sei straordinario VRonin.
                    Ma la mia ignoranza è talmente grande da non riuscire a capire dove può stare un errore. Eccolo:
                    0_1520576321256_Schermata del 2018-03-09 07-16-39.png
                    Ancora moltissime grazie.

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      bvox123
                      wrote on last edited by
                      #10

                      Non so come ho fatto, ma sono riuscito a farlo funzionare.
                      Studierò, ma sono convinto di avere ancora bisogno del tuo aiuto.
                      Grazie.

                      1 Reply Last reply
                      0
                      • VRoninV Offline
                        VRoninV Offline
                        VRonin
                        wrote on last edited by VRonin
                        #11

                        Ho aggiornato il codice. Ora i pedoni si possono muovere e mangiare.
                        L'errore della vtable e' solo un singhiozzo, basta cancellare la cartella di build, re-runnare qmake e tutto funziona

                        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                        ~Napoleon Bonaparte

                        On a crusade to banish setIndexWidget() from the holy land of Qt

                        1 Reply Last reply
                        0
                        • B Offline
                          B Offline
                          bvox123
                          wrote on last edited by
                          #12

                          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:
                          0_1520595941793_Schermata del 2018-03-09 12-38-10.png
                          Per caso il motivo risiede nel fatto che non si possono impostare alcune proprietà da programma, ma solo col generatore del QtCreator ?

                          1 Reply Last reply
                          0
                          • B Offline
                            B Offline
                            bvox123
                            wrote on last edited by
                            #13

                            Ho risolto, mi mancava l'include.

                            1 Reply Last reply
                            0
                            • VRoninV Offline
                              VRoninV Offline
                              VRonin
                              wrote on last edited by VRonin
                              #14

                              Se ti puo' aiutare ho finito il programma qui: https://github.com/VSRonin/EsempioScacchi

                              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                              ~Napoleon Bonaparte

                              On a crusade to banish setIndexWidget() from the holy land of Qt

                              1 Reply Last reply
                              0
                              • B Offline
                                B Offline
                                bvox123
                                wrote on last edited by
                                #15

                                Certo che mi può aiutare. Sei stato gentilissimo e ti ringrazio molto.

                                1 Reply Last reply
                                0

                                • Login

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • Categories
                                • Recent
                                • Tags
                                • Popular
                                • Users
                                • Groups
                                • Search
                                • Get Qt Extensions
                                • Unsolved