Как убрать горизонтальную линию в QWizard? - PullRequest
0 голосов
/ 27 сентября 2018

Я работаю над таблицей стилей QWizard и хочу удалить горизонтальную линию чуть выше кнопок:

Screenshot

Я попытался рекурсивно просмотреть всевиджеты и установите их границу в none, но ни у одного виджета, кажется, нет этой границы.

Вот мой код ( полный пример сборки можно найти здесь ):

licensewizard.h

#ifndef LICENSEWIZARD_H
#define LICENSEWIZARD_H

#include <QWizard>

class LicenseWizard : public QWizard
{
  Q_OBJECT

public:
  enum
  {
    Page_Welcome
  };
  LicenseWizard(QWidget *parent = 0);
};

class WelcomePage : public QWizardPage
{
  Q_OBJECT

public:
  WelcomePage(QWidget *parent = 0);
};

#endif

licensewizard.cpp

#include <QtWidgets>
#include "licensewizard.h"

#include <QtDebug>

LicenseWizard::LicenseWizard(QWidget *parent)
    : QWizard(parent)
{
    setPage(Page_Welcome, new WelcomePage);
    setStartId(Page_Welcome);
    setWizardStyle(ModernStyle);
    setWindowTitle(tr("License Wizard"));

    for (auto *widget : this->findChildren<QWidget *>())
    {
        widget->setStyleSheet("background:none; border:none; margin:0; padding:0;");
    }
}

WelcomePage::WelcomePage(QWidget *parent)
    : QWizardPage(parent)
{
    setTitle(tr("Welcome"));
}

Возможно ли это и как?

1 Ответ

0 голосов
/ 27 сентября 2018

Причина

На эту линейку QWizardRuler *bottomRuler таблица стилей не влияет, потому что QWizardRuler наследует QWizardHeader, и линия рисуется вQWizardHeader::paintEvent:

void QWizardHeader::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.drawPixmap(0, 0, bannerPixmap);
    int x = width() - 2;
    int y = height() - 2;
    const QPalette &pal = palette();
    painter.setPen(pal.mid().color());
    painter.drawLine(0, y, x, y);
    painter.setPen(pal.base().color());
    painter.drawPoint(x + 1, y);
    painter.drawLine(0, y + 1, x + 1, y + 1);
}

Решение

Поскольку эту линейку удалить нельзя, я бы посоветовал вам скрыть ее.

реализация QWizardHeader::paintEvent дает представление о том, как это сделать, то есть путем установки роли цвета , используемой для рисования линии, QPalette::Mid, в соответствующий цвет, который смешивается с фоном, QPalette::Base.

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

Пример

ВотЯ подготовил для вас пример того, как можно реализовать предложенное решение:

Заменить

for (auto *widget : this->findChildren<QWidget *>())
{
    widget->setStyleSheet("background:none; border:none; margin:0; padding:0;");
}

на

QPalette p(palette());

p.setColor(QPalette::Mid, p.color(QPalette::Base));

setPalette(p);

Результат

ЗаданноеПример дает следующий результат:

QWizard page without a horizontal ruler

...