Как убрать горизонтальную линию в QWizard?

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

Скриншот

Я попытался рекурсивно просмотреть все виджеты и установить для их границы значение 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 ответ

Решение

причина

Этот правитель, 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 без горизонтальной линейки

Другие вопросы по тегам