2016-10-26 3 views
2

独自のカスタムデリゲートを作成するときは、createEditor(),setEditorData()およびsetModelData()を実装します。私は次の問題に直面しています。私が見たcreateEditor()のすべての例は、QComboBoxやQLineEditのような単純なものを使用していますが、これはshow()またはexec()メンバー関数を持たず、QDialogを使用しようとする度にプログラムは未定義の動作をしています(QDialogが表示されます)。しかし、狂った行動。私はシグナル/スロットマジックを使用してプログラムを稼働させましたが、標準的なパターンを使って実装したいと思います。例えば、http://cep.xray.aps.anl.gov/software/qt4-x11-4.2.2/model-view-delegate.htmlどうすればいいですか?QDialogをカスタムデリゲートにスティックするにはどうすればよいですか?

未定義の動作に直面したときに何が起きるかを詳しく調べるために、createEditor()でQDialogの親を設定すると、QDialogは表示されません。設定しないと表示されます(それはとにかく間違っていて、私はいつも親を設定しなければならないと思います。そうでなければ私はメモリリークを起こすからです)。私は今、私の質問は次のようになっていると思います。QDialogを正しく表示させるにはどうすればいいですか?私はsetEditorData()、setModelData()、およびcreateEditor()の異なる部分にshow()とexec()を貼り付けようとしましたが、何も正しく動作しません。

+0

ウィジェットではなくダイアログが必要な理由はありますか? – Hayt

+0

@Hayt、そこにQTreeViewを表示したいので、別のウィンドウが必要です。 – Pavel

+0

ダイアログではなくカスタムウィジェットを作成します。デリゲートにウィジェットを貼り付けることができます。 – Hayt

答えて

4

エディタデリゲートは、ビューに埋め込まれたウィジェットでなければなりません。望むのであればトップレベルウィンドウを自由に作成できますが、ウィンドウの可視性と適切なフォーカスを制御する必要があります。つまり、エディタウィジェットの可視性が変更された場合は、ダイアログボックスも変更する必要があります。エディタウィジェットがフォーカスを取得した場合は、適切なUXのダイアログにフォーカスを移す必要があります。

QWidget * MyDelegate::createEditor(QWidget * parent, 
        const QStyleOptionViewItem &, const QModelIndex & index) const 
{ 
    auto editor = new QWidget{parent}; 
    auto dialog = new QDialog{editor, Qt::Window}; 
    ... 
    return editor; 
} 

動作しませんでしたあなたのQDialog -editorは、その形状や状態だったということです理由:

ソリューションは、トップレベルのウィンドウである子QDialogを持って空のQWidgetを持つことですビューによって管理されます。このビューは、エディタ/デリゲートのレイアウトのように機能します。このような操作からダイアログを保護するために、介在するウィジェットを挿入する必要があります。確かに、ビューはエディタのフラグをチェックし、Qt::Windowフラグが設定されていればジオメトリの調整などを控えることができますが、それを実装していないと誰も責めることは稀です。あなたはもちろん、Qtに変更を提出することは自由です!

+0

答えてくれてありがとうございますが、メインウィンドウのQModelIndexをダブルクリックするとQDialogを開く方法を教えてください。 – Pavel

+0

あなたはおそらく、メンバーとしてダイアログを持ち、そのコンストラクタでexecを呼び出しているカスタムQWidgetを作成する必要があると思いますか? – Pavel

+0

@Pavelあなたはカスタムウィジェットについて正しくあります。また、 'exec()'ではなく 'show()'を使用してください。一般に、 'QDialog :: exec()'は悪い考えです。実世界が擬似同期しているように見えるからです。 –

1

デリゲートのメソッドはインラインエディタ用で、ビュー内に表示されるウィジェットです。

externエディタを使用する場合は、ビューの信号に反応するだけでよい場合があります。 clicked()を開き、そのスロットからダイアログを開きます。

+0

インラインエディタのどこにあるのですか?私は参照を持つことはできますか? – Pavel

+0

Qtのモデル/ビューアーキテクチャのデリゲートコンセプトの一部です。デリゲートは、モデルのデータ項目を表示および編集するために使用されます。 デリゲートはビューによって、それぞれの 'QModelIndex'によって参照される単一のセルを扱うために使用されます。 エディタは、表示するのではなく入力を容易にするために、セルの通常の視覚化の代わりに表示されるウィジェットです –

+0

おかげで、信号とスロットで動作するようにしました。それは他のすべてのエディタと同じように機能します。 – Pavel

関連する問題