【问题标题】:How to remove the horizontal line in a QWizard?如何删除 QWizard 中的水平线?
【发布时间】:2019-03-03 11:13:40
【问题描述】:

我正在处理 QWizard 的样式表,我想删除按钮上方的水平线:

我尝试递归浏览所有小部件并将其边框设置为无,但似乎没有小部件具有此边框。

这是我的代码(可以在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"));
}

有可能吗?如何实现?

【问题讨论】:

  • 一个最小的例子是少于一半的行数,全部在一个 .cpp 文件中,带有 Java 风格的类(没有单独的方法定义)——并且很适合这个问题,可能没有滚动条:)。我建议你这样做,它会让重现变得更容易——所以问题不是你需要大量样板的企业怪物。

标签: c++ qt user-interface qwizard


【解决方案1】:

原因

这个标尺QWizardRuler *bottomRuler不受样式表影响,因为QWizardRuler inherits 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::Midcolor 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);

结果

给定的示例产生以下结果:

【讨论】:

  • 感谢这个有用的答案。它在最小示例中运行良好,但我不明白为什么它在我的原始代码中不起作用。我试图禁用所有样式表,但它没有改变任何东西。仍然有一条很细的线。还有什么需要检查的吗?
  • @matt,如原因中所写,此行不受影响,即不能通过设置样式表来删除,因为绘制它是在绘制事件处理程序中硬编码的。这意味着,无论您使用什么样式表,都不能将其删除。但是您可以通过修改小部件的调色板来隐藏它。
  • @matt,因为它有效,您可以将答案标记为已接受。此外,如果您喜欢它,您可能会考虑在声望达到 15 或更多时点赞。
  • 是的,我明白了。修改调色板对我的原始代码没有影响:(但是给定示例接受了答案。
  • @你说的原始代码是什么意思?我已使用您的代码创建示例。
猜你喜欢
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2013-06-01
相关资源
最近更新 更多