2009-11-24 19 views
2

Je suis encore en train d'apprendre Qt et je suis redevable à la communauté SO pour m'avoir fourni des réponses très, très opportunes à mes questions Qt. Je vous remercie.Comment ajouter un en-tête avec des données à un QTableWidget dans Qt?

Je suis assez confus sur l'idée d'ajouter un en-tête à un QTableWidget. Ce que je voudrais faire est d'avoir une table qui contient des informations sur les membres de l'équipe. Chaque ligne d'un membre doit contenir son prénom et son nom, chacun dans sa propre cellule, une adresse électronique dans une cellule et un bureau dans l'autre cellule. Je voudrais avoir un en-tête au-dessus de ces colonnes pour les nommer comme il convient.

J'essaie de démarrer facile et obtenir seulement l'en-tête pour afficher "Last" (comme dans le nom de famille). Voici mon code.

 
    int column = m_ui->teamTableWidget->columnCount(); 
    m_ui->teamTableWidget->setColumnCount(column+1); 
    QString* qq = new QString("Last"); 
    m_ui->teamTableWidget->horizontalHeader()->model()->setHeaderData(0, Qt::Horizontal, QVariant(QVariant::String, &qq)); 

Ma table est correctement corrigée, mais l'en-tête ne contient pas ce que j'attendais. Il contient 1 cellule qui contient le texte "1".

Je suis évidemment en train de faire quelque chose de très bête ici qui est faux, mais je suis perdu. Je continue à verser sur la documentation, ne trouvant rien. Voici les liens de documentation vers les appels de fonctions que je fais pour la toute dernière ligne.

http://doc.trolltech.com/4.5/qtableview.html#horizontalHeader http://doc.trolltech.com/4.5/qabstractitemview.html#model http://doc.trolltech.com/4.5/qabstractitemmodel.html#setHeaderData

Merci pour toute aide.

+0

Si c'était la réponse réelle à votre problème, vous devriez l'afficher comme réponse et l'accepter. –

Répondre

3

À la demande de la personne qui m'a dirigé vers le bon endroit, je poste la façon dont j'ai accompli cela en tant que répondez et je l'accepte.

 
    m_ui->teamTableWidget->setColumnCount(m_ui->teamTableWidget->columnCount()+1); 
    QTableWidgetItem* qtwi = new QTableWidgetItem(QString("Last"),QTableWidgetItem::Type); 
    m_ui->teamTableWidget->setHorizontalHeaderItem(0,qtwi); 
4

La solution la plus simple est setHorizontalHeaderLabels(myListOfHeaderLabels).

+0

Cela ne m'aide pas vraiment car QTableWidget contient un QAbstractItemModel *, pas un QStandardItemModel *. Un appel à model() ne peut pas être converti en un QStandardItemModel * ou un résultat segfault lors de la déréférence. Si j'essaie d'utiliser QTableWidget-> setModel(), je ne peux pas compiler car setModel() est privé. –

+0

Je voulais en fait créer un lien vers 'QTableWidget :: setHorizontalHeaderLabels'. Même nom de méthode, même fonctionnalité. –

+0

@ LukášLalinský: J'ai réparé le lien cassé pour vous maintenant 5 ans plus tard. ;-) Mais je pense que vous devriez développer votre réponse pour ne pas être seulement un lien. Il est facile de fournir un code d'exaple. – lpapp

5

Je vois un problème potentiel, et aussi un moyen plus facile de le faire.

D'abord, le problème:

QString* qq = new QString("Last"); // <- qq is a pointer to a string. 
m_ui->teamTableWidget->horizontalHeader()->model()->setHeaderData(0, 
    Qt::Horizontal, 
    QVariant(QVariant::String, &qq)); // <- You take the address of a pointer, or create a handle. 

Je pense que vous voulez faire à la place:

QString* qq = new QString("Last"); 
m_ui->teamTableWidget->horizontalHeader()->model()->setHeaderData(0, 
    Qt::Horizontal, QVariant(QVariant::String, *qq)); 

Maintenant, la façon plus facile de définir les données pour un élément d'en-tête:

m_ui->teamTableWidget->horizontalHeaderItem(0)->setText("Last"); 
+0

Merci.S'il vous plaît voir mon edit dans la question pour voir comment je l'ai résolu. Votre aide m'a amené là-bas. Merci encore. –

2

pour la postérité:

Le implimentations par défaut de setHeaderData() et headerData() dans QAbstractItemModel ne font rien. Vous pouvez (devez?) (Ré) implémenter headerData() afin de retourner une étiquette utile.