QStyledItemDelegate部分选择默认QLineEdit编辑器的文本

时间:2016-09-23 18:38:02

标签: c++ qt qstyleditemdelegate

我有一个QStyledItemDelegate的子类,目前没有重新实现任何功能(为了简化问题)。

使用默认QStyledItemDelegate实施,当用户开始编辑QTableView中的文字时,代表会使用模型中的文字绘制QLineEdit,然后选择所有文本(突出显示)全部用于编辑)。

文本表示文件名,例如“document.pdf”。允许用户编辑整个文本,但是,我只想最初突出显示基本名称部分(“文档”)而不是后缀(“pdf”)。我怎样才能做到这一点? (我不需要如何做到这一点的逻辑,我需要知道如何让QStyledItemDelegate突出显示部分文本)

我试过了:

请帮助,并提前感谢。我们非常感谢一个代码片段,例如选择文本的前3个字符。

1 个答案:

答案 0 :(得分:4)

正如我对该问题的评论中所述,子类化QStyledItemDelegate并尝试在setEditorData中设置任何默认选择的问题如下:

void setEditorData(QWidget* editor, const QModelIndex &index)const{
    QStyledItemDelegate::setEditorData(editor, index);
    if(index.column() == 0){ //the column with file names in it
        //try to cast the default editor to QLineEdit
        QLineEdit* le= qobject_cast<QLineEdit*>(editor);
        if(le){
            //set default selection in the line edit
            int lastDotIndex= le->text().lastIndexOf("."); 
            le->setSelection(0,lastDotIndex);
        }
    }
}

是(在Qt代码中)视图调用我们的setEditorData here后,当编辑器小部件为{{1}时,它会尝试调用selectAll() here }。这意味着我们在QLineEdit中提供的任何选择都会在之后发生变化。

我能想出的唯一解决方案是以排队的方式提供我们的选择。这样,我们的选择在执行回到事件循环时设置。这是一个有效的例子:

screenshot

setEditorData

这可能听起来像是黑客,但我决定写这个,直到有人能更好地解决问题。