2012-07-02 3 views
3


저는 PyQt를 사용하여 프로그램을 작성하고 있습니다. QTableView를 사용하여 데이터를 표시합니다.
문제는 셀의 편집 (예 : F2 누름)을 트리거 할 때 셀의 텍스트가 모두 기본적으로 선택 (강조 표시)되어 있습니다. 텍스트를 수정하고 모두 다시 작성하지 않으므로 편리하지 않습니다.
그래서 동작을 변경하는 기능이 있는지 알고 싶습니다.

감사합니다qtableview 텍스트 편집

답변

4

이 간단한 방법이지만, 당신이 QLineEdit를 만들어 자신의 항목 대리자를 쓸 수 있는지 확실하지. 모델 데이터로 편집기를 업데이트 할 때 텍스트의 선택을 취소하고 커서를 처음으로 이동할 수 있습니다. 대리인 (나는 그래서 그것을 테스트 할 수 없습니다 지금 당장 사용할 수있는 Qt는 설치되어 있지 않지만, 아이디어 작동합니다)이 같은 것입니다 :

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); 
} 

당신이 이전에 대표단을 사용하지 않은 경우 Qt 문서에는 유용한 example이 있습니다.

+0

고맙습니다. 많은 도움이됩니다. –

1

사용자 정의 편집기 위젯을 사용하려면 해당 필드에 편집에 사용되는 위젯을 대체 할 수 있도록가 대리자를 구현해야합니다.

QTableView는 기본적으로 QTextEdit을 사용하며 하위 클래스로 분류하여 동작을 변경할 수 있습니다. 가장 좋은 추측은 포커스를받을 때의 동작을 변경하기 위해 편집기 위젯에서 포커스 정책 (focusInEvent [1])을 조작해야한다는 것입니다.

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