5

簡単なQtの質問があります。自動生成された UIC ファイルが、次のようなカスタム インターフェイス クラスから派生するようにします。

目的

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

生成された UIC ファイルは次のようになります。

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

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

なんで?

次に、すべての Ui::Class が MyUiInterface を実装します。Ui::Class ( The Multiple Inheritance Approachを参照) から派生する各クラスでは、UI::Class クラスから派生するクラスが基本クラスである場合に意味のあるsetupUiandを呼び出すことができます。retranslateUiすべてのウィジェットを 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、その特定のクラスが呼び出されることです。それ以外の場合、各クラスで changeEvent を再実装する必要がありました。これは、「コードの再利用」の概念に少し反します。

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

4

1 に答える 1

0

残念ながら、ui ファイルの XML スキーマを読み取ると、uic コンパイラを使用してこれを自動化することはできないことがわかります。

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

なぜあなたはクラスで再実装しないのですかsetupUi?すべての Ui クラスにはこれらのクラスの 1 つがあるため、基本クラスではなく、このレベルでこれを実装できます。何かが欠けている可能性がありますが、これはこれを行う適切な方法だと思います。retranslateUiMyWidget

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

};

changeEvent()このアプローチでは、カスタム ウィジェットを再実装する必要はなく、changeEvent引き続き適切なretranslateUi().

于 2013-02-06T11:12:37.017 に答える