Se connecter avec
S'enregistrer | Connectez-vous

[Résolu] Conversion d'un entier vers la lettre correspondante

Dernière réponse : dans Programmation

Bonjour,

Je voudrais comprendre le fonctionnement de la fonction encode_pos(int row, int col) dans le bout de code ci-dessous. La fonction est ensuite utilisée dans la méthode SpreadSheet::updateStatus(QTableWidgetItem *item) à la ligne 22.
  1. #include <QtGui>
  2.  
  3. static QString encode_pos(int row, int col) {
  4. return QString(col + 'A') + QString::number(row + 1);
  5. }
  6.  
  7. // ...
  8.  
  9. SpreadSheet::SpreadSheet(int rows, int cols, QWidget *parent)
  10. : QMainWindow(parent)
  11. {
  12. //...
  13. addToolBar(toolBar = new QToolBar());
  14. cellLabel = new QLabel(toolBar);
  15. toolBar->addWidget(cellLabel);
  16. table = new QTableWidget(rows, cols, this);
  17. // ...
  18. void SpreadSheet::updateStatus(QTableWidgetItem *item)
  19. {
  20. if (item && item == table->currentItem()) {
  21. statusBar()->showMessage(item->data(Qt::StatusTipRole).toString(), 1000);
  22. cellLabel->setText("Cell: (" + encode_pos(table->row(item), table->column(item)) + ")");
  23. }
  24. }
  25. // ...
  26. }

Voici le résultat de cette fonction (je passe sur la sémantique C++, seul le résultat m'importe) :
  1. // Sélection de la cellule (0,0) :
  2. "Cell: (A1)"
  3. // Sélection de la cellule (1,1) :
  4. "Cell: (A1)"
  5. // Sélection de la cellule (1,3) :
  6. "Cell: (C1)"
  7. // Sélection de la cellule (2,5) :
  8. "Cell: (E2)"
Je ne comprends pas l'instruction de la ligne 4
  1. QString(col + 'A')
sachant que col est un entier :??: 

En gros: comment font-il pour traduire 1 en "A", 2 en "B", etc... ???

Pour info: Ce code C++ est issu de la démo "Spreadsheet" de Qt4. J'essaie de le reproduire en python avec PyQt4.
Lassé par la pub ? Créez un compte

Bon évidemment c'est une fois posté mon problème que je trouve la solution :fou: 

Voici les liens vers les pages web qui m'ont aidé à comprendre :

http://www.commentcamarche.net/cpp/cpptype.php3 à la partie "Caractère (char)":
Citation :
Le type char (provenant de l'anglais character) permet de stocker la valeur ASCII d'un caractère, c'est-à-dire un nombre entier !
Tout est dit :sweat: 

http://forum.hardware.fr/hfr/Programmation/Python/conversion-ascii-entier-sujet_66156_1.htm
Grâce à ce deuxième lien j'ai pu réécrire la fonction en Python:
  1. def encode_pos(row, col):
  2. return chr(col + ord('A')) + str(row + 1)


... je m'en retourne potasser mon C++ et mon Python ... :D 


Alors finalement, pour rester compatible avec les autres méthodes de la classe, j'ai écrit la fonction de manière à renvoyer un QString :
  1. from PyQt4 import QtCore
  2.  
  3. def encode_pos(row, col):
  4. # row, col : int
  5. return QtCore.QString(col + QtCore.QChar('A').unicode()) + QtCore.QString.number(row + 1)

Et voici la fonction decode_pos pour décoder "E4" en ligne 4, colonne 5 :
  1. def decode_pos(pos):
  2. # pos: QString
  3. col = -1
  4. row = -1
  5. if not pos.isEmpty():
  6. col = QtCore.QChar(pos.at(0).toLatin1()[0]).unicode() - QtCore.QChar('A').unicode()
  7. row = pos.right(pos.size() - 1).toInt()[0] - 1
  8. return row, col

Je me gave avec Qt4 et PyQt4 en ce moment :D  (signaux/slots, programmation Model/View, ...)
Dommage que PyQt4 ne soit pas très bien documenté :/ 
Lassé par la pub ? Créez un compte