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

bka*_*sbk 5 user-interface qt interface generator

我有一个简单的Qt问题.我希望自动生成的UIC文件派生自自定义接口类,如:

意向

class MyUiInterface {
public:
     virtual void setupUi(QWidget* w) = 0;
     virtual void retranslateUi(QWidget*w) = 0;
};
Run Code Online (Sandbox Code Playgroud)

生成的UIC文件应如下所示:

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

namespace Ui {
    class MyWidget : public MyUiInterface , public Ui_MyWidget {};
}
Run Code Online (Sandbox Code Playgroud)

为什么?

然后每个Ui :: Class都会实现MyUiInterface.在每个派生自Ui :: Class的类中(请参阅多重继承方法),我将能够调用setupUi,retranslateUi如果从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 {
};
Run Code Online (Sandbox Code Playgroud)

每次调用MyWidget :: changeEvent()时,效果retranslateUi都是调用该特定类.否则必须在每个类中重新实现changeEvent.这将有点反对"代码重用"概念.

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

Nem*_*ric 0

不幸的是,阅读ui 文件的 XML 模式告诉我们,使用 uic 编译器不可能实现自动化。

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

为什么你不在你的课堂上重新实现setupUiand呢?每个 Ui 类都会有这些类之一,因此您可以在此级别上实现它,而不是基类。我可能会遗漏一些东西,但我认为这是执行此操作的适当方法。retranslateUiMyWidget

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

};
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您不需要changeEvent()在任何自定义小部件中重新实现,并且changeEvent仍然会调用适当的retranslateUi().