在Qt中从表单继承的最佳方法

3
什么是从Qt Designer创建的表单继承的最佳方式?

2
请问您能否详细说明您的问题? - SMK
在我看来,使用private类继承。 - Serge Dundich
1个回答

5

没有很好的直接继承自身的方法,最好是继承为表单创建的类。

class testBase : public QWidget
{
    Q_OBJECT

public:
    testBase (QWidget *parent = 0);
    ~testBase ();

protected: // here was private
    Ui::testBaseClass baseUi; // rename this
};

testBase ::testBase (QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
}

此外,如果您想添加其他形式,这也是可能的,但您需要进行额外的工作:
1)在基类(某个容器)中为子UI指定占位符。
2)使用向导创建您的子表单。不要将您的基类作为祖先传递,在向导中应指定您从QWidget继承。
3)创建派生类的表单后,将其重写为基类的后代。更改其构造函数,行ui.setupUi(this)应更改为ui.setupUi(baseUi.placeholder)
class testDerived : public testBase 
{
    Q_OBJECT

public:
    testDerived (QWidget *parent = 0);
    ~testDerived ();

private:
    Ui::testDerivedClass ui;
};

testDerived::testDerived(QWidget *parent)
    : testBase (parent)
{
    ui.setupUi(baseUi.placeholder);
}

还要注意,派生类不会改变基类表单,而是扩展它。您将无法在表单构造函数中添加或删除基本表单项,但您指定为占位符的容器将填充派生类的表单数据。


当然可以。甚至QtCreator也支持继承方法。它并不是从自身继承,而是从QtDesigner生成的表单类继承。 - Sebastian Mach
那会是哪些不明确的地方呢?我并没有看出它比一般的继承更加脆弱。另请参见http://doc.qt.nokia.com/latest/designer-using-a-ui-file.html。(顺便说一下,我个人更喜欢指向表单的方法;我只是在质疑你的说法) - Sebastian Mach
我是说 class derived: public QWidget, private Ui::SomeForm, private Ui::SomeForm2。这样的多重继承会让人头疼。 - Raiv
这也不是推荐的方法之一。其中一个推荐的方法是 class derived: public QWidget, private Ui::SomeForm,没有 Form2。请注意,Form2 本身不是一个小部件,所以我认为这并不会带来什么麻烦。只有在表单和派生类中声明相同的符号时才会出现问题,当然这不是好的做法。但头痛真的不是继承固有的问题。 - Sebastian Mach
请查看我提供的链接。在每种标准方法中,只有一个“Ui”::setupUi()被调用,没有歧义。除了Ui类中的QLabel之外,还有哪些额外的标签?您是否将自动表单与手动静态表单混合使用? - Sebastian Mach
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接