【问题标题】:The best way to inherit from form in qt [closed]从 qt 中继承表单的最佳方法 [关闭]
【发布时间】:2011-07-07 08:40:58
【问题描述】:

从 qt 设计器中创建的表单继承的最可取的方式是什么?

【问题讨论】:

  • 能否详细说明您的问题
  • 带有private类继承IMO。

标签: c++ qt inheritance


【解决方案1】:

没有很好的直接继承form本身的方法,你最好继承为form创建的类。

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 生成的表单类。
  • 好吧,你可以继承那个类。但这是不好的做法。这会导致名称歧义和其他一些令人讨厌的事情。没有办法解决 - 没有好办法
  • 那会是什么歧义?我看不出它比一般继承更脆弱。另见doc.qt.nokia.com/latest/designer-using-a-ui-file.html。 (顺便说一句,我个人更喜欢指向表单的方法;我只是在质疑你的说法)
  • 我的意思是class derived: public QWidget, private Ui::SomeForm, private Ui::SomeForm2。这样的双重继承会让人头疼
  • 这也不是推荐的方式。推荐的方法之一是class derived: public QWidget, private Ui::SomeForm,没有Form2。请注意,Form2 本身并不是一个小部件,所以我认为这并不令人头疼。仅当您在 Form 和派生程序中声明相同的符号时,它才会变得令人头疼,这当然不是一个好习惯。但令人头疼的事情并不是继承固有的。
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多