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

  • Auteur de la discussion frodon1
  • Date de début

frodon1

Grand Maître
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.
[cpp] #include <QtGui>

static QString encode_pos(int row, int col) {
return QString(col + 'A') + QString::number(row + 1);
}

// ...

SpreadSheet::SpreadSheet(int rows, int cols, QWidget *parent)
: QMainWindow(parent)
{
//...
addToolBar(toolBar = new QToolBar());
cellLabel = new QLabel(toolBar);
toolBar->addWidget(cellLabel);
table = new QTableWidget(rows, cols, this);
// ...
void SpreadSheet::updateStatus(QTableWidgetItem *item)
{
if (item && item == table->currentItem()) {
statusBar()->showMessage(item->data(Qt::StatusTipRole).toString(), 1000);
cellLabel->setText("Cell: (" + encode_pos(table->row(item), table->column(item)) + ")");
}
}
// ...
}[/cpp]
Voici le résultat de cette fonction (je passe sur la sémantique C++, seul le résultat m'importe) :
[cpp]// Sélection de la cellule (0,0) :
"Cell: (A1)"
// Sélection de la cellule (1,1) :
"Cell: (A1)"
// Sélection de la cellule (1,3) :
"Cell: (C1)"
// Sélection de la cellule (2,5) :
"Cell: (E2)"[/cpp]Je ne comprends pas l'instruction de la ligne 4 [cpp]QString(col + 'A')[/cpp] 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.
 

frodon1

Grand Maître
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 :

à la partie "Caractère (char)":
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:


Grâce à ce deuxième lien j'ai pu réécrire la fonction en Python:
Code:
def encode_pos(row, col):
    return chr(col + ord('A')) + str(row + 1)

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

batchy

Grand Maître
pour ton python, "%c%d"%(col + ord('A'), row + 1)" marche aussi ;)
 

frodon1

Grand Maître
Alors finalement, pour rester compatible avec les autres méthodes de la classe, j'ai écrit la fonction de manière à renvoyer un QString :
[cpp]from PyQt4 import QtCore

def encode_pos(row, col):
# row, col : int
return QtCore.QString(col + QtCore.QChar('A').unicode()) + QtCore.QString.number(row + 1)[/cpp]
Et voici la fonction decode_pos pour décoder "E4" en ligne 4, colonne 5 :
[cpp]def decode_pos(pos):
# pos: QString
col = -1
row = -1
if not pos.isEmpty():
col = QtCore.QChar(pos.at(0).toLatin1()[0]).unicode() - QtCore.QChar('A').unicode()
row = pos.right(pos.size() - 1).toInt()[0] - 1
return row, col[/cpp]
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é :/
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 122
Messages
6 717 721
Membres
1 586 356
Dernier membre
TommyStam
Partager cette page
Haut