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