2010-12-17 14 views
6

Qtプロパティブラウザライブラリをレコードエディタとして使用しています。ユーザーが任意のフィールドの編集を完了したときに、編集項目からフォーカスを削除するか、またはEnterキーを押して、変更を受け取り、処理してREALに送信できるように通知する必要がありますアイテムが変更されています。QtPropertyBrowserと値が変更されたシグナル

残念ながら、私はpropertyChanged信号とvalueChanged信号を見つけることができないようで、ユーザーが仕上げをトリガーしているときだけでなく、任意の量のテキストが追加または削除されるたびにトリガーされます。

この通知を受け取ることができないと、これがどのように使用可能なコンポーネントになるかわかりません。ユーザーが[ESC]を押すと元に戻りませんが、私はこれを実装する必要があります。確かに私は必要なことをするシグナルが全くないということについて間違っていなければなりませんが、確かにそれを見つけることはできません。

誰でも知っていますか?ソースコードを調べる際に


、ラインエディタの工場を作った人はtextEditedではなくeditingFinishedと接続するために不幸な決断を下しました。かなり体系的に拡張可能なインターフェースを持つこのエディタファクトリを拡張することが不可能になったことを除いて、変更するのは比較的簡単なことです!

私は、createEditor関数をオーバーライドし、不正な接続を切断し、より良い接続を呼び出して、行編集コントロールから文字列を取得する必要があります。しかし、いいえ!私たちはあなたにそれをさせるつもりはありません!私たちは、すべての会計処理をアクセスできない、または呼び出すことのできないプライベートクラスに置くつもりです。電話をかける予定の部分は、彼らがコールしているという事実と密接に結びつくでしょう。他のものではなく、編集コントロール。 ERGO、私たちは想像することができなかったように、事実上、イライラすることは不可能であった。私たちは華麗ではありませんか?


もっと知りました。これらの種類のオブジェクトに対する標準的なQtアプローチは、代理人が私が得ようとしている振る舞いを制御するために使用します。 Qtプロパティライブラリはこの振る舞いをオーバーライドし、私が達成しようとしていないものを実行します。 QAbstractItemDelegateインターフェイスの内部には、ユーザーが編集内容をコミットするときに添付されるビューによって呼び出されるsetModelData関数があります。コミットせずにエディタを破棄するときは呼び出されません。

次のトリックは、Qt Model/Viewアーキテクチャを習得し、正しい方法でライブラリをパッチすることです。これは、私が得ようとしている振る舞いを破壊するオーバーライドスタブを単に削除するだけではありません。 QtTreeViewを使用する代わりにこのシステムを使用することは、異なる種類のブラウザ間で切り替える機能を維持することができれば良いが、より良い選択かもしれない。

は私がTreePropertyBrowser内のプライベートなものに「commitItem(QModelIndex)」機能を追加しました:

+1

5年後、私はあなたと同じ気分になりました。私は、.NETのものと同じくらい少しでもプロパティグリッドを作るために多くのハッキングを行ってきました。 – Jack

答えて

4

だから、ここで私が思い付いたハーフお尻の修正です。次に、setModelData()関数が呼び出されたときにデリゲートから呼び出す。

これはプロパティを見つけ、AbstractBrowserに追加した新しい関数を呼び出してプロパティのファクトリをフェッチし、ファクトリに "commitProperty(QtProperty *)"を通知します。

この関数は、基底とLineEditFactoryで空の仮想です。これは、valueChanged()信号を生成するプロパティの変更を適用するためにオーバーライドします。

ユーザーがESCキーを押すことで、編集の外にバックアップすることが可能であり、彼らはRETURNを押すことで、プロパティの変更をコミットする場合に限っ私は通知を得る代わりにこれらの変更により、変更焦点を当て、等...

のみ現時点では、ツリーバージョン用に動作します。おそらく、残りの作業をしようとすることを心配しません。実際に私はおそらく、このライブラリを投げ捨てて、自分でQTreeViewを使うつもりです。 ITは私の望むやり方で動作しますが、このことは、行動をBACKにするためには、ユーバーハッキングが必要でした。

ああ、LineEditFactoryのcreateEditor()でtextChanged()シグナルへの接続も削除する必要があります。

1

私はこの前と同じ問題に遭遇しました。私たちはQVariantエディタの編集がいつ完了したかを知る必要がありました。トリックは、フレームワークが編集を開始したり停止したりするときにウィジェットを作成して削除することです。したがって、EditorFactoryクラスに埋め込まれたQObject :: destroyedシグナルは、作成するすべての単一のQWidgetタイプに接続され、メインアプリケーションが捕捉できる新しいpropertyEditFinishedシグナルをバブリングしました。

QtPropertyBrowserは間違いなく狂っていますが、全体を再実装するのも苦痛です。

+0

実際、私はそれを実現するには大変な作業ではないことを発見しました。プロパティブラウザ(私がとにかく欲しかった部分)は基本的なツリービューに過ぎません。 –

+0

あなたは正しいです。それがエンジニアリングに関するものです。何をすべきか、最も簡単なことはいつもあなたが本当にやるべきことに戻るということです。 :)私たちは怠け者です!あなたがうまく働いてうれしい。 – Thadeux

1

QtPropertyBrowserとフレンドを組み込んだQt 5では、この質問はもはや関係しません。私はThadeaux's approachの行に沿ってeditingFinishedシグナルをQtLineEditorFactoryに実装し、それを必要としない、あるいはそうしたいと決めた!おそらく私の時間を無駄にする気持ちを和らげるために、誰かが役に立つと思うかもしれない場合に備えて、自分の解決策のコード差分を取ります。

Index: src/qteditorfactory.cpp 
    =================================================================== 
    --- src/qteditorfactory.cpp (revision 737) 
    +++ src/qteditorfactory.cpp (working copy) 
    @@ -1076,7 +1076,6 @@ 
    } 


    - 
    /*! 
     \class QtLineEditFactory 

    @@ -1094,7 +1093,6 @@ 
    { 
     d_ptr = new QtLineEditFactoryPrivate(); 
     d_ptr->q_ptr = this; 
    - 
    } 

    /*! 
    @@ -1121,6 +1119,10 @@ 
       this, SLOT(slotEchoModeChanged(QtProperty *, int))); 
     connect(manager, SIGNAL(readOnlyChanged(QtProperty*, bool)), 
      this, SLOT(slotReadOnlyChanged(QtProperty *, bool))); 
    + 
    + // c.s. Added 4/12/2017 
    + connect(this, SIGNAL(propertyEditingFinished(QtProperty*, const QString&)), 
    +  manager, SIGNAL(propertyEditingFinished(QtProperty*, const QString&))); 
    } 

    /*! 
    @@ -1131,7 +1133,6 @@ 
    QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager, 
      QtProperty *property, QWidget *parent) 
    { 
    - 
     QLineEdit *editor = d_ptr->createEditor(property, parent); 
     editor->setEchoMode((EchoMode)manager->echoMode(property)); 
     editor->setReadOnly(manager->isReadOnly(property)); 
    @@ -1146,9 +1147,49 @@ 
        this, SLOT(slotSetValue(const QString &))); 
     connect(editor, SIGNAL(destroyed(QObject *)), 
        this, SLOT(slotEditorDestroyed(QObject *))); 
    - return editor; 
    + 
    + // c.s. Added 4/12/2017 
    + connect(editor, SIGNAL(editingFinished()), SLOT(handleEditingFinished())); 
    + return editor; 
    } 

    + 
    + 
    +// c.s. Added 4/12/2017 
    +void QtLineEditFactory::handleEditingFinished() 
    +{ 
    + auto keys = d_ptr->m_editorToProperty.keys(); 
    + QLineEdit *le = qobject_cast<QLineEdit*>(sender()); 
    + if (!le) 
    +  return; 
    + 
    + disconnect(le, SIGNAL(editingFinished()), this, SLOT(handleEditingFinished())); 
    + 
    + QtProperty *property = 0; 
    + 
    + const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = 
    +  d_ptr->m_editorToProperty.constEnd(); 
    + for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = 
    +   d_ptr->m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) 
    + { 
    +  if (itEditor.key() == le) 
    +  { 
    +   property = itEditor.value(); 
    +   if (!property) 
    +    return; 
    +   
    +   QtStringPropertyManager *manager = propertyManager(property); 
    + 
    +   if (!manager) 
    +    return; 
    + 
    +   QString s = manager->value(property); 
    +   manager->setValue(property, s); // make sure it has the last value 
    +   emit propertyEditingFinished(property, s); 
    +  } 
    + } 
    +} 
    + 
    /*! 
     \internal 

    @@ -1165,6 +1206,9 @@ 
     disconnect(manager, SIGNAL(readOnlyChanged(QtProperty*, bool)), 
      this, SLOT(slotReadOnlyChanged(QtProperty *, bool))); 

    + // c.s. Added 4/12/2017 
    + disconnect(this, SIGNAL(propertyEditingFinished(QtProperty*, const QString&)), 
    +  manager, SIGNAL(propertyEditingFinished(QtProperty*, const QString&))); 
    } 

    // QtDateEditFactory 
    Index: src/qteditorfactory.h 
    =================================================================== 
    --- src/qteditorfactory.h (revision 737) 
    +++ src/qteditorfactory.h (working copy) 
    @@ -183,6 +183,14 @@ 
     QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property, 
        QWidget *parent); 
     void disconnectPropertyManager(QtStringPropertyManager *manager); 
    + 
    +// c.s. Added 4/12/2017 
    +Q_SIGNALS: 
    + void propertyEditingFinished(QtProperty*, const QString&); // signal editing done in line_editor is finished 
    + 
    +protected slots: 
    + void handleEditingFinished(); // similar to QLineEdit 
    + 
    private: 
     QtLineEditFactoryPrivate *d_ptr; 
     Q_DECLARE_PRIVATE(QtLineEditFactory) 
    Index: src/qtpropertymanager.h 
    =================================================================== 
    --- src/qtpropertymanager.h (revision 737) 
    +++ src/qtpropertymanager.h (working copy) 
    @@ -200,6 +200,9 @@ 
     void echoModeChanged(QtProperty *property, const int); 
     void readOnlyChanged(QtProperty *property, bool); 

    + // c.s. Added 4/12/2017 
    + void propertyEditingFinished(QtProperty *, const QString &val); 
    + 
    protected: 
     QString valueText(const QtProperty *property) const; 
     QString displayText(const QtProperty *property) const; 
関連する問題