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

#c #qt #qt5 #wizard

#c #qt #qt5 #мастер

Вопрос:

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

QWizardPage в QtDesigner

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

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

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

И результат:

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

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

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

Комментарии:

1. Как вы изменили стиль QWizard? Взгляните сюда doc.qt.digia.com/qq/qq20-qss.html , в главе «Коробочная модель» 😉

2. Под стилизацией QWizard я имел в виду параметр стиля мастера, который устанавливается с помощью setWizardStyle (стиль WizardStyle) и может быть ClassicStyle, ModernStyle, MacStyle, AeroStyle и NStyles. Установка полей и отступов равными 0 в таблицах стилей QWizard не поможет.

3. На мой взгляд, вы должны проверять поля и отступы в обоих ваших виджетах (родительском и дочернем), а не только в QWizard.

4. Спасибо за идею, но это не помогло. Я написал: «поле: 0; отступ: 0; граница: 0;»

5. @serg.v.gusev вы решили это в конце концов?

Ответ №1:

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

 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, виджет мастера уничтожил себя, поэтому я перенаправил сигнал «готово» () на «готово моего диалога» (), чтобы закрыть его:

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

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

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

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