2013-02-06 3 views
5

私は簡単なQt質問をしました。UICがカスタムインターフェイスからQt UIクラスを生成しました

class Ui_MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 
}; 

namespace Ui { 
    class MyWidget : public MyUiInterface , public Ui_MyWidget {}; 
} 

理由:

意向

class MyUiInterface { 
public: 
    virtual void setupUi(QWidget* w) = 0; 
    virtual void retranslateUi(QWidget*w) = 0; 
}; 

生成UICファイルは次のようになります。私は、自動的に生成されたUICファイルは中のようなカスタムインターフェイスクラスから派生していることをしたいですか?

すべてのUi :: ClassはMyUiInterfaceを実装します。 Ui :: Class(The Multiple Inheritance Approachを参照)から派生する各クラスでは、setupUiretranslateUiを呼び出すことができます。これは、UI :: Classクラスから派生したクラスが基本クラスの場合でも意味があります。すべてのウィジェットをabstrcatベースクラスMyWidgetBaseから派生させたい。次の点を考慮

class MyWidgetBase abstract : public QWidget, protected MyUiInterface { 
protected: 
    void changeEvent(QEvent *e) { 
     QWidget::changeEvent(e); 
     if (e->type() == QEvent::LanguageChange) { 
      retranslateUi(this); // Still abstract here 
     } 
    } 
}; 

class MyWidget : public MyWidgetBase : public Ui::MyWidget { 
}; 

効果は、すべての時間はMyWidgetです:: ChangeEventの()は、その特定のクラスのretranslateUiが呼び出され、callledされます。それ以外の場合は、各クラスでchangeEventを再実装する必要がありました。これは "コード再利用"の概念とは少し違うでしょう。

Qt UICはこの状況を処理できないと思いますか?この問題を解決するための同様の方法はありますか?

+0

+1大きな質問! – cmannett85

答えて

0

残念ながら、XML Schema for ui filesを読むと、uicコンパイラを使用して自動化することができないことがわかります。

しかし、UICが何らかの形であなたのインターフェースを実装していても、手動で関数の本体を追加し、生成された.hファイルを編集する必要があります。なぜなら、私はC++コードとして変換するカスタムコードをxmlファイルに含める方法がないと確信しています。

MyWidgetクラスにsetupUiretranslateUiを再実装しないのはなぜですか?すべてのUiクラスはこれらのクラスの1つを持つので、これを基本クラスの代わりにこのレベルで実装できます。私は何かを逃している可能性がありますが、私はこれを行う適切な方法と見ています。このアプローチで

class MyWidget : public MyWidgetBase, public Ui::MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 

}; 

、カスタムウィジェットのいずれかでchangeEvent()を再実装する必要はありません、とchangeEventはまだ適切なretranslateUi()を呼び出します。

+0

私はあなたが意味することは、setupUiとretranslateUiをMyWidgetBaseクラスの仮想メソッドとして作成し、そこにUi :: MyWidget :: setupUi(this)を呼び出してMyWidget(およびMyWidgetBaseから派生した他のすべて)で実装することだと思います。これは確かに解決策になるでしょう。私の解決策では、生成されたヘッダファイルをUIコンパイラが意図したとおりに動作する方法で編集する必要はありません:) – bkausbk

+0

@bkausbk残念ながら、ここの誰かがこれを行う方法を知らない限り、私は考えませんそれは可能です - しかし、見てみましょう、私は多くのものが後に働いているのを見ました:) –

関連する問題