Я пишу некоторые мастера, использующие Qt 5.2.1 под Ubuntu 13.10. У меня есть изображение заголовка и я хочу показать его вверху почти на всех страницах мастера. Поэтому я открыл QtDesigned, создал новую форму QWizardPage, и результат выглядит (концептуально):
Синяя область вверху — это мое изображение заголовка. Он должен занимать всю верхнюю область, от (0,0) до (window.width, image.height).
Затем я просто добавляю эту страницу в QWizard:
SetupWizard::SetupWizard(QWidget * parent) : QWizard(parent) {
welcomePage_ = new SetupWizardWelcomePage(this);
setPage(WELCOME_PAGE, welcomePage_);
...
И результат:
Как видите, слева, справа и сверху от моего изображения заголовка есть небольшие поля. Я пытался изменить стиль QWizard, установить фиксированный размер и поиграть с геометрией — мне ничего не помогает. Похоже, этот интервал определен внутри класса QWizard, но я не уверен в этом.
Так я могу показать заголовок без пробела, используя QWizard? Или я должен создать свой собственный класс Wizard?
Баннер и логотип заголовка могут быть установлены с помощью
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 раньше создавал странные цвета, когда заголовок не был установлен.
Это работает в конце, но, возможно, создать мастера с нуля было бы проще.