web-dev-qa-db-fra.com

Définir l'alignement par défaut des cellules dans QTableWidget

Je sais que vous pouvez définir l'alignement de chaque élément en utilisant:

TableWidget->item(0,0)->setTextAlignment(Qt::AlignLeft);

Cependant, je voudrais définir un alignement par défaut pour toutes les cellules afin de ne pas avoir à le définir à chaque fois que je crée un nouvel élément. C'est possible?

19
jsalvador

Oui c'est possible. Mais vous devez comprendre que vous ne modifiez pas une propriété du widget de table, mais une propriété de l'élément de widget de table. Créez d'abord votre propre article et configurez-le comme vous le souhaitez

 QTableWidgetItem * protoitem = new QTableWidgetItem();
 protoitem->setTextAlignment(Qt::AlignLeft);
 etc...

Ensuite, chaque fois que vous souhaitez créer un nouvel élément plutôt que d'utiliser le constructeur que vous utilisez

 QTableWidgetItem * newitem = protoitem->clone();
 tableWidget->setItem(0,0, newitem);

Une autre alternative au clone (non testé) est pour définir un prototype sur votre tablewidget

QTableWidget::setItemPrototype ( const QTableWidgetItem * item )

Ce dernier peut être plus approprié si vous utilisez une interface utilisateur ou si l'élément est modifiable.

21
UmNyobe

Je ne pense pas qu'il existe une méthode existante pour cela, mais voici deux approches qui fonctionnent:


1.) Sous-classe QTableWidgetItem

MyTableWidgetItem::MyTableWidgetItem() :
    QTableWidgetItem()
{
    setTextAlignment( Qt::AlignLeft );
}

Cependant, c'est probablement un peu exagéré pour un seul paramètre + vous voudrez peut-être surcharger les quatre constructeurs de QTableWidgetItem .


2.) Une autre approche est en utilisant une usine au lieu d'appeler new :
Remarque: L'article lié parle de tests unitaires, mais il y a beaucoup plus d'avantages à le faire.

QTableWidgetItem* MyTableWidgetFactory::createTableWidgetItem( const QString& text ) const
{
    QTableWidgetItem* item = new QTableWidgetItem( text );
    item->setTextAlignment( Qt::AlignLeft );
    return item;
}

Au lieu de

QTableWidgetItem* myItem = new QTableWidgetItem( "foo" );
item->setTextAlignment( Qt::AlignLeft );

tu peux faire

QTableWidgetItem* myItem = myFactory->createTableWidgetItem( "foo" );

myFactory est un objet de MyTableWidgetFactory.

8
Tim Meyer