从自定义界面派生UIC生成的Qt UI类

时间:2013-02-06 10:17:43

标签: qt user-interface interface generator

我有一个简单的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),我可以调用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。否则必须在每个类中重新实现changeEvent。这有点违背“代码重用”的概念。

我认为Qt UIC是不是能够处理这种情况不是吗?有没有类似的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

不幸的是,阅读XML Schema for ui files告诉我们这不可能自动使用uic编译器。

但是,我不清楚为什么你想自动实现它 - 即使Uic以某种方式设法实现你的界面,你仍然需要手动添加函数体,编辑生成的.h文件,如我确信无法在xml文件中包含自定义代码,该代码将转换为C ++代码。

为什么您不在setupUi课程中重新实现retranslateUiMyWidget?每个Ui类都有这些类中的一个,因此您可以在此级别而不是基类上实现此类。我可能错过了一些东西,但我认为这是一种合适的方法。

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

};

使用此方法,您无需在任何自定义小部件中重新实现changeEvent()changeEvent仍会调用相应的retranslateUi()