Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
qtableview文本编辑_Qt_Pyqt_Qtableview - Fatal编程技术网

qtableview文本编辑

qtableview文本编辑,qt,pyqt,qtableview,Qt,Pyqt,Qtableview,我正在用PyQt编写一个程序。我使用QTableView显示数据。 问题是,当我触发单元格的编辑(例如按F2键)时,默认情况下,单元格中的文本全部选中(高亮显示)。这不方便,因为我想修改文本,但不想全部重写。 所以我想知道是否有任何函数可以改变行为? 谢谢您需要实现一个委托,这样您就可以覆盖用于编辑该字段的小部件,以使用自定义编辑器小部件 默认情况下,QTableView将使用QTextEdit,您可以尝试对其进行子分类并更改其行为。我最好的猜测是,您需要操纵编辑器小部件上的焦点策略,可能是f


我正在用PyQt编写一个程序。我使用QTableView显示数据。
问题是,当我触发单元格的编辑(例如按F2键)时,默认情况下,单元格中的文本全部选中(高亮显示)。这不方便,因为我想修改文本,但不想全部重写。
所以我想知道是否有任何函数可以改变行为?


谢谢

您需要实现一个委托,这样您就可以覆盖用于编辑该字段的小部件,以使用自定义编辑器小部件

默认情况下,QTableView将使用QTextEdit,您可以尝试对其进行子分类并更改其行为。我最好的猜测是,您需要操纵编辑器小部件上的焦点策略,可能是focusInEvent[1],以更改它接收焦点时的行为


[1]

不确定是否有更简单的方法,但您可以编写自己的项委托来创建QLineEdit。使用模型数据更新编辑器时,取消选择文本,并可能将光标移到开头。该委托应该是这样的(我现在没有可用的Qt安装,所以我无法测试它,但这个想法应该可行):

QWidget*MyDelegate::createEditor(QWidget*parent、,
常量QSTYLEOPTION视图项和选项,
常数QModelIndex和索引)常数
{
//只需创建一个纯直线编辑。
QLineEdit*编辑器=新的QLineEdit(父级);
返回编辑器;
}
void MyDelegate::setEditorData(QWidget*编辑器,
常数QModelIndex和索引)常数
{
//从模型中获取当前数据。
QString值=index.model()->数据(index,Qt::EditRole).toString();
//将行编辑文本设置为当前数据。
QLineEdit*lineEdit=static_cast(编辑器);
lineEdit->setText(值);
//取消选择文本。
lineEdit->deselect();
//将光标移到开头。
lineEdit->setCursorPosition(0);
}
void MyDelegate::setModelData(QWidget*编辑器,
QAbstrateModel*模型,
常数QModelIndex和索引)常数
{
//使用“行编辑”中的文本设置模型数据。
QLineEdit*lineEdit=static_cast(编辑器);
QString值=lineEdit.text();
模型->设置数据(索引、值、Qt::EditRole);
}

如果您以前没有在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);
}