2016-09-23 6 views
2

私はQStyledItemDelegateというサブクラスを持っていますが、現時点では(質問を簡単にするために)関数を再実装していません。デフォルトQStyledItemDelegate実装でQStyledItemDelegateは部分的にデフォルトのテキストを選択しますQLineEditエディタ

、ユーザーがQTableViewでテキストを編集し始めたときに、デリゲートは、モデルからテキストをQLineEditを描画し、それのすべて(すべての編集のために強調して)を選択します。

このテキストは、「document.pdf」などのファイル名を表します。ユーザーはこのテキスト全体を編集することができますが、最初は接尾辞( "pdf")ではなく、ベース名部分(「文書」)のみを強調表示します。これどうやってするの? (私はこれを行う方法のロジックを必要としない、私はQStyledItemDelegateは、テキストの一部を強調するために取得する方法を知っておく必要があります)

私が試してみた:setEditorData()

  • を使用QLineEdit::setSelection()テキストを強調表示します。これは効果がありません。

  • paint()他の回答者が類似の質問に対して推奨したことに基づいてペイントを試みましたが、成功しませんでした。私はQPainterの経験がほとんどありません。ここに例があります:Adjusting the selection behaviour of QStandardItem with QStyledItemDelegate

ご協力ありがとうございます。テキストの最初の3文字を選択するコードスニペットは大変ありがとうございます。

+0

ロールが 'Qt :: EditRole'の場合、モデルに拡張子を付けずにファイル名を返すことができます。しかし、その方法では、ユーザーは内線番号を変更することができません。 – Mike

+0

拡張機能を編集可能にするには、選択範囲をペイントする必要はありません。実際には、ライン編集の選択を拡張機能を除外するように設定する必要があります。あなたが言及している2番目のアプローチはあなたのためには機能しません。 – Mike

+0

は 'setEditorData'をオーバーライドし、うまく動作するはずだったはずの選択肢を設定します。しかし、[Qt source code](https://code.woboq.org/qt5/qtbase/src/widgets/itemviews/qabstractitemview.cpp.html#4217)では 'le-> selectAll()の呼び出しを見ることができます。 ; '' setEditorData'の後に。残念なことに、それはあなたが 'setEditorData'に入れたどのような選択もその呼び出しで変更されることを意味します。だからあなたの最初のアプローチはうまくいきません。 – Mike

答えて

4

質問に対する私のコメントで述べたように、サブクラス化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で提供された選択肢はその後変更されます。

私が考えることができる唯一の解決策は、私たちの選択を待ち行列に入れて提供することでした。そのため、実行がイベントループに戻ったときに選択が設定されます。ここで実施例がある:

screenshot

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

これはハックのように聞こえるかもしれないが、私は誰かが、問題へのより良いアプローチになるまで、これを書くことにしました。

+0

マイクありがとうございました。これは、私がカラム> 0を編集しているので、if(index.column()== 0)の行を削除するコードを少し修正するだけで完全に動作します。回避策のように見えます。 Qtへのバグレポートは、ウィジェットにアクセスするためのより良いAPIを提供して、ユーザがそれを完全に制御できるようにします。ありがとうございました:) – CSLover

+0

@CSLover、あなたは大歓迎です。それは私がそれを置くことによって意味されたものです、あなたはファイル名を持っていたので、それをカラムに変更する必要があります:) – Mike

+0

@CSLover、私はバグ報告について本当に確信していません。しかし、個人的には、バグレポートを提出する価値はないと思います。 'setEditorData'をオーバーライドしたユーザは' selectAll() 'を呼び出してその行編集中のテキストを選択させる義務がないように' QLineEdit'sの 'le-> selectAll()'を呼び出しているようですデフォルト。その呼び出しを省略すると、すでに書かれたコードの多くが、デフォルトでは選択されていない 'QLineEdit'を表示することになります。 – Mike

関連する問題