4

我有一个项目,我真的很想使用 Designer 来直观地设计我的向导。

当我第一次这样做时,我将 QWizard 小部件和每个 QWizardPage 放在单独的 .ui 文件中,然后通过调用 addPages() 构建向导。这工作但很混乱,因为我的项目突然在向导中的每页有一组 .h/.cpp/.ui 文件。

然后我意识到设计师可以将 QWizardPage 添加到 QWizard 本身并“提升”页面,以便我可以使用自己的类功能。这样,我只有一个用于 QWizard 的 .ui 文件和两组 .h/.cpp 文件(一组用于 QWizard,一个用于每个 QWizardPage)。

所以,我的项目看起来有点像这样:

  • Wizard.ui - 包含向导和相应页面的所有 GUI 元素
  • Wizard.h/.cpp - 包含 QWizard 派生类的代码
  • WizardPages.h/.cpp - 包含每个 QWizardPage 的代码

这很好用!直到我开始添加实现。我想做的第一件事是在第一页注册一个字段(比如 WizardPage1)。

WizardPage1::WizardPage1(QWidget* parent)
    : QWizardPage(parent)
{
    this->registerField("text*", textLineEdit);
}

但“textLineEdit”实际上是 QWizard 对象的成员。所以,我想我可以通过使用 QWizardPage 的父级来注册该字段,但是 ui_Wizard.h 文件中生成的代码会创建没有父级的 QWizardPage 对象。当我尝试这个时:

Wizard::Wizard(QWidget *parent)
    : QWizard(parent)
{
    setupUi(this); // Wizard inherits QWizard and the deginer generated class

    // 'WizardPage1' is also the class name and variable name as
    // generated by Qt
    WizardPage1->setParent(this);
}

但是,当我这样做时,这会导致崩溃:

Wizard* wizard = new Wizard(this);
wizard->open(); // crashes

有没有人尝试过我想要完成的事情并让它发挥作用?

4

0 回答 0