【问题标题】:Derive UIC generated Qt UI class from custom interface从自定义界面派生 UIC 生成的 Qt UI 类
【发布时间】:2013-01-21 12:01:05
【问题描述】:

我有一个简单的 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 类的类也是基类,这也是有意义的。我希望每个小部件都派生自我的抽象基类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 无法处理这种情况,不是吗?有没有类似的方法可以解决这个问题?

【问题讨论】:

    标签: qt user-interface interface generator


    【解决方案1】:

    不幸的是,阅读 XML Schema for ui files 告诉我们使用 uic 编译器无法实现自动化。

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

    为什么你不在你的MyWidget 类中重新实现setupUiretranslateUi?每个 Ui 类都会有这些类之一,因此您可以在此级别上实现它,而不是基类。我可能遗漏了一些东西,但我认为这是一种合适的方法。

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

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

    【讨论】:

    • 好吧,我想你的意思是将 setupUi 和 retranslateUi 作为 MyWidgetBase 类中的虚拟方法,并通过调用 Ui::MyWidget::setupUi(this ) 那里。这确实是一个解决方案。使用我的解决方案,不需要以 if UI 编译器将按我的意图工作的方式编辑生成的头文件 :)
    • @bkausbk 不幸的是,除非这里有人不知道如何做到这一点,否则我认为这是不可能的 - 但让我们看看,毕竟我看到了很多工作:)跨度>
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多