質問に対する私のコメントで述べたように、サブクラス化QStyledItemDelegate
と、このようなsetEditorData
内の任意のデフォルトの選択を設定しようとしているとの問題:ビューは、私たちの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のコードで)ですhereの場合、エディタウィジェットがQLineEdit
の場合はselectAll()
hereを呼び出しようとします。つまり、setEditorData
で提供された選択肢はその後変更されます。
私が考えることができる唯一の解決策は、私たちの選択を待ち行列に入れて提供することでした。そのため、実行がイベントループに戻ったときに選択が設定されます。ここで実施例がある:
#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();
}
これはハックのように聞こえるかもしれないが、私は誰かが、問題へのより良いアプローチになるまで、これを書くことにしました。
ロールが 'Qt :: EditRole'の場合、モデルに拡張子を付けずにファイル名を返すことができます。しかし、その方法では、ユーザーは内線番号を変更することができません。 – Mike
拡張機能を編集可能にするには、選択範囲をペイントする必要はありません。実際には、ライン編集の選択を拡張機能を除外するように設定する必要があります。あなたが言及している2番目のアプローチはあなたのためには機能しません。 – Mike
は 'setEditorData'をオーバーライドし、うまく動作するはずだったはずの選択肢を設定します。しかし、[Qt source code](https://code.woboq.org/qt5/qtbase/src/widgets/itemviews/qabstractitemview.cpp.html#4217)では 'le-> selectAll()の呼び出しを見ることができます。 ; '' setEditorData'の後に。残念なことに、それはあなたが 'setEditorData'に入れたどのような選択もその呼び出しで変更されることを意味します。だからあなたの最初のアプローチはうまくいきません。 – Mike