从自定义接口派生UIC生成的Qt UI类
我有一个简单的问题。我希望自动生成的UIC文件从自定义接口类派生,如: 意图从自定义接口派生UIC生成的Qt UI类,qt,user-interface,interface,generator,Qt,User Interface,Interface,Generator,我有一个简单的问题。我希望自动生成的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) { ...
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::类都将实现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 {
};
其效果是,每次调用MyWidget::changeEvent()时,都会调用该特定类的retranslateUi。否则,changeEvent必须在每个类中重新实现。这有点违背“代码重用”的概念
我认为Qt UIC无法处理这种情况,不是吗?有没有类似的方法来解决这个问题?不幸的是,reading告诉我们,使用uic编译器是不可能实现自动化的
但是,我不清楚为什么你会自动实现这个——即使UIC不知何故设法实现你的接口,你仍然需要手工添加函数的主体,编辑生成的.H文件,因为我确信没有办法将自定义代码包含在XML文件中,这将转化为C++代码。 为什么不在
MyWidget
类中重新实现setupUi
和retranslateUi
?每个Ui类都有一个这样的类,所以您可以在这个级别上实现它,而不是在基类上实现它。我可能遗漏了一些东西,但我认为这是一种适当的方法
class MyWidget : public MyWidgetBase, public Ui::MyWidget {
public:
void setupUi(QWidget* w) {
...
}
void retranslateUi(QWidget* w) {
...
}
};
使用这种方法,您不需要在任何自定义小部件中重新实现
changeEvent()
,并且changeEvent
仍将调用相应的retranslateUi()
好的,我想您的意思是将setupUi和retranslateUi作为MyWidgetBase类中的虚拟方法,并在MyWidget中实现它(以及从MyWidgetBase派生的所有其他文件)调用Ui::MyWidget::setupUi(this)。这确实是一个解决方案。对于我的解决方案,如果Ui编译器能够按照我的意图工作,则无需编辑生成的头文件:)@bkausbk不幸的是,除非这里有人不知道如何进行此操作,我认为这是不可能的——但让我们看看,毕竟我看到了很多东西在起作用:)