删除QWizard内QWizardPage周围的额外空间

时间:2014-07-04 14:21:06

标签: c++ qt qt5 wizard

我在Ubuntu 13.10下使用Qt 5.2.1编写了一些向导。我有标题图像,并希望在几乎所有向导页面的顶部显示它。所以我打开了QtDesigned,创建了新的QWizardPage表单,结果看起来像(概念上):

QWizardPage in QtDesigner

顶部的蓝色区域是我的标题图片。它应该占据所有顶部区域,从(0,0)到(window.width,image.height)。

然后我将此页面添加到QWizard:

SetupWizard::SetupWizard(QWidget * parent) : QWizard(parent) {
    welcomePage_ = new SetupWizardWelcomePage(this);
    setPage(WELCOME_PAGE, welcomePage_);
    ...

结果是:

QWizardPage in running app

正如您所看到的,我的标题图片左侧,右侧和顶部的边距很小。我试图改变QWizard的样式,设置固定大小和玩几何 - 没有什么可以帮助我。看起来这个间距是在QWizard类中定义的,但是我不确定它。

所以我能使用QWizard显示没有间距的标题吗?或者我必须创建自己的Wizard类?

1 个答案:

答案 0 :(得分:1)

可以使用

设置标题的横幅和徽标
setPixmap(QWizard::BannerPixmap, bannerPixmap);
setPixmap(QWizard::LogoPixmap, logoPixmap);

但是,向导窗口将不再可以水平调整大小。此外,我想更自定义标题,所以我添加了自定义标题到QWizardPage。这会在页面周围产生白色边框,您也会观察到它。

在QWizard的构造函数中可以使用此hack删除边框:

QWidget *flickerWidget = (QWidget *)(children()[0]);
flickerWidget->layout()->setContentsMargins(0, 0, 0, 0);

但它不实用,因为按钮上面的按钮也会丢失填充加上按钮周围没有填充。

我最终做的是:

  • 使用QVBoxLayout布局创建了一个从QDialog继承的新小部件,其中我放置了自定义标题小部件+ QWizard实例。

  • 连接到向导的currentIdChanged(int)信号,并在信号处理程序中更新自定义标题的标题和副标题。

  • 如果按下了ESC,向导窗口小部件会自行销毁,所以我将它的完成()信号路由到我的对话框已完成()以关闭它:

connect(m_wizard, SIGNAL(finished(int)), this, SLOT(done(int)));

可选:我还制作了QWizardPage的自定义子类,其中我重写了setTitle和setSubTitle,并且没有调用父类的子类,因此原始标题不可见。在currentIdChanged()处理程序中,我查询了标题/副标题的页面子类,并将其设置在自定义标题中。

我还使用了setWizardStyle(QWizard::ClassicStyle),因此向导将具有适当的背景颜色/填充,而没有它的原生标题/副标题。当标题没有设置时,ModernStyle用于产生奇怪的颜色。

最终可行,但也许从头开始创建向导会更容易。