Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从自定义接口派生UIC生成的Qt UI类_Qt_User Interface_Interface_Generator - Fatal编程技术网

从自定义接口派生UIC生成的Qt UI类

从自定义接口派生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) { ...

我有一个简单的问题。我希望自动生成的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::类都将实现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不幸的是,除非这里有人不知道如何进行此操作,我认为这是不可能的——但让我们看看,毕竟我看到了很多东西在起作用:)