3 votes

qtableview édition de texte

Je suis en train d'écrire un programme avec PyQt. J'utilise QTableView pour afficher les données.
Le problème est que lorsque je déclenche l'édition (par exemple en appuyant sur F2) d'une cellule, le texte de la cellule est sélectionné (en surbrillance) par défaut. Ce n'est pas pratique car je veux modifier le texte mais pas les réécrire tous.
Je veux donc savoir s'il existe une fonction permettant de modifier ce comportement ?

Merci.

5voto

Claudio Points 1608

Je ne sais pas s'il existe un moyen plus simple, mais vous pouvez écrire votre propre délégué d'élément qui crée un QLineEdit. Lors de la mise à jour de l'éditeur avec les données du modèle, vous désélectionnez le texte et déplacez éventuellement le curseur au début. Le délégué serait quelque chose comme ceci (je n'ai pas d'installation Qt disponible pour le moment donc je ne peux pas le tester, mais l'idée devrait fonctionner) :

QWidget * MyDelegate::createEditor(QWidget *parent,
        const QStyleOptionViewItem & option,
        const QModelIndex & index) const
{
    // Just creates a plain line edit.
    QLineEdit *editor = new QLineEdit(parent);
    return editor;
}

void MyDelegate::setEditorData(QWidget *editor,
        const QModelIndex &index) const
{
    // Fetch current data from model.
    QString value = index.model()->data(index, Qt::EditRole).toString();

    // Set line edit text to current data.
    QLineEdit * lineEdit = static_cast<QLineEdit*>(editor);
    lineEdit->setText(value);

    // Deselect text.
    lineEdit->deselect();

    // Move the cursor to the beginning.
    lineEdit->setCursorPosition(0);
}

void MyDelegate::setModelData(QWidget *editor,
        QAbstractItemModel *model,
        const QModelIndex &index) const
{
    // Set the model data with the text in line edit.
    QLineEdit * lineEdit = static_cast<QLineEdit*>(editor);
    QString value = lineEdit.text();
    model->setData(index, value, Qt::EditRole);
}

Si vous n'avez pas encore utilisé les délégués dans la documentation de Qt, il y a un outil utile exemple .

1voto

Simon Hibbs Points 1827

Vous devrez implémenter un délégué pour pouvoir remplacer le widget utilisé pour les modifications de ce champ afin d'utiliser un widget d'éditeur personnalisé.

Le QTableView utilise un QTextEdit par défaut. Vous pouvez essayer de le sous-classer et de modifier son comportement. Je pense que vous devez manipuler la politique de mise au point du widget de l'éditeur, éventuellement focusInEvent[1], pour modifier son comportement lorsqu'il reçoit la mise au point.

[1] http://doc.qt.nokia.com/4.7/qwidget.html#focusInEvent

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X