2

我有一个子类,QStyledItemDelegate目前它没有重新实现任何功能(为了简单起见)。

在默认QStyledItemDelegate实现中,当用户开始编辑 a 中的文本时QTableView,委托使用模型中的文本绘制 a QLineEdit,并选择所有文本(突出显示所有文本以进行编辑)。

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

我试过了:

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

4

1 回答 1

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

是在视图调用我们的setEditorData here之后(在 Qt 代码中),当编辑器小部件是. 这意味着我们提供的任何选择都会在之后更改。selectAll() QLineEditsetEditorData

我能想出的唯一解决方案是以排队的方式提供我们的选择。因此,我们的选择是在执行回到事件循环时设置的。这是工作示例:

截屏

#include <QApplication>
#include <QtWidgets>

class FileNameDelegate : public QStyledItemDelegate{
public:
    explicit FileNameDelegate(QObject* parent= nullptr)
        :QStyledItemDelegate(parent){}
    ~FileNameDelegate(){}

    void setEditorData(QWidget* editor, const QModelIndex &index)const{
        QStyledItemDelegate::setEditorData(editor, index);
        //the column with file names in it
        if(index.column() == 0){
            //try to cast the default editor to QLineEdit
            QLineEdit* le= qobject_cast<QLineEdit*>(editor);
            if(le){
                QObject src;
                //the lambda function is executed using a queued connection
                connect(&src, &QObject::destroyed, le, [le](){
                    //set default selection in the line edit
                    int lastDotIndex= le->text().lastIndexOf(".");
                    le->setSelection(0,lastDotIndex);
                }, Qt::QueuedConnection);
            }
        }
    }
};

//Demo program

int main(int argc, char** argv){
    QApplication a(argc, argv);

    QStandardItemModel model;
    QList<QStandardItem*> row;
    QStandardItem item("document.pdf");
    row.append(&item);
    model.appendRow(row);
    FileNameDelegate delegate;
    QTableView tableView;
    tableView.setModel(&model);
    tableView.setItemDelegate(&delegate);
    tableView.show();

    return a.exec();
}

这听起来像是一个 hack,但我决定写这个,直到有人有更好的方法来解决这个问题。

于 2016-09-24T04:46:13.043 回答