如何去除 QWizard 中的横线?
How to remove the horizontal line in a QWizard?
我正在处理 QWizard
的样式表,我想删除按钮上方的水平线:
我尝试递归浏览所有小部件并将它们的边框设置为none,但似乎没有小部件具有此边框。
这是我的代码(可以找到完整的可构建示例 here):
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"));
}
这可能吗?如何实现?
原因
这把尺子,QWizardRuler *bottomRuler
, is not affected by the stylesheet, because QWizardRuler
inherits QWizardHeader
and the line is drawn in the 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
的 color role 设置为适当的颜色,从而混合有了背景,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
的样式表,我想删除按钮上方的水平线:
我尝试递归浏览所有小部件并将它们的边框设置为none,但似乎没有小部件具有此边框。
这是我的代码(可以找到完整的可构建示例 here):
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"));
}
这可能吗?如何实现?
原因
这把尺子,QWizardRuler *bottomRuler
, is not affected by the stylesheet, because QWizardRuler
inherits QWizardHeader
and the line is drawn in the 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
的 color role 设置为适当的颜色,从而混合有了背景,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);
结果
给出的示例产生以下结果: