Удалить лишнее пространство вокруг QWizardPage внутри QWizard

Я пишу некоторые мастера, использующие Qt 5.2.1 под Ubuntu 13.10. У меня есть изображение заголовка и я хочу показать его вверху почти на всех страницах мастера. Поэтому я открыл QtDesigned, создал новую форму QWizardPage, и результат выглядит (концептуально):

QWizardPage в QtDesigner

Синяя область вверху — это мое изображение заголовка. Он должен занимать всю верхнюю область, от (0,0) до (window.width, image.height).

Затем я просто добавляю эту страницу в QWizard:

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

И результат:

QWizardPage в запущенном приложении

Как видите, слева, справа и сверху от моего изображения заголовка есть небольшие поля. Я пытался изменить стиль QWizard, установить фиксированный размер и поиграть с геометрией — мне ничего не помогает. Похоже, этот интервал определен внутри класса QWizard, но я не уверен в этом.

Так я могу показать заголовок без пробела, используя QWizard? Или я должен создать свой собственный класс Wizard?

2

Решение

Баннер и логотип заголовка могут быть установлены с помощью

setPixmap(QWizard::BannerPixmap, bannerPixmap);
setPixmap(QWizard::LogoPixmap, logoPixmap);

Однако окно мастера больше не будет изменять размер по горизонтали. Кроме того, я хотел еще больше изменить заголовок, поэтому вместо него я добавил собственный заголовок в QWizardPage. Это привело к появлению белой рамки вокруг страницы, которую вы также заметили.

Границу можно удалить с помощью этого хака в конструкторе QWizard:

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

Но это не практично, так как разделитель над кнопками также потеряет заполнение, плюс вокруг кнопок не будет заполнения.

Что я сделал в итоге:

  • Создан новый виджет, унаследованный от QDialog с макетом QVBoxLayout, в который я поместил свой виджет заголовка + экземпляр QWizard.

  • Соединен с сигналом мастера currentIdChanged (int) и обновил заголовок и подзаголовок пользовательского заголовка в обработчике сигнала.

  • Если была нажата ESC, виджет-мастер уничтожил себя, поэтому я перенаправил сигнал завершения () в свой диалог done (), чтобы закрыть его:

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

Необязательный: Я также создал собственный подкласс QWizardPage, в котором я переопределил setTitle и setSubTitle и не вызывал родительские, так что оригинальный заголовок не будет виден. В обработчике currentIdChanged () я запросил подкласс страницы для title / subtitle и установил его в настраиваемом заголовке.

Я также использовал setWizardStyle(QWizard::ClassicStyle) таким образом, у мастера будет соответствующий цвет фона / отступы без его собственного названия / субтитра. ModernStyle раньше создавал странные цвета, когда заголовок не был установлен.

Это работает в конце, но, возможно, создать мастера с нуля было бы проще.

1

Другие решения


По вопросам рекламы [email protected]