QLabel 在使用 HTML 内容时绘制不正确的背景
QLabel is painting improper background when using HTML content
通常,QLabel
是用透明背景绘制的。但是,如果 HTML 内容设置为标签文本,它会开始使用父(我猜)背景:
主窗口:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
GradientWidget *widget = new GradientWidget(this);
setCentralWidget(widget);
resize(400, 300);
QVBoxLayout *layout = new QVBoxLayout(widget);
layout->addWidget(new QLabel("Label with a proper (transparent) background", this));
layout->addWidget(new QLabel("<b>HTML</b> label with an <i>improper</i> (inherited from parent) background"));
}
渐变小部件:
class GradientWidget : public QWidget
{
Q_OBJECT
public:
GradientWidget(QWidget *parent = 0) : QWidget(parent) {}
protected:
void GradientWidget::paintEvent(QPaintEvent *event)
{
QLinearGradient gradient(event->rect().topLeft(), event->rect().bottomRight());
gradient.setColorAt(0, Qt::white);
gradient.setColorAt(1, Qt::darkYellow);
QPainter painter(this);
painter.fillRect(event->rect(), gradient);
}
};
我正在使用 Qt 5.2.1 和 Windows 10.
有什么办法可以解决这种奇怪的行为吗?是错误还是功能?
我不确定它是否是错误 - 已在此处报告 QTBUG-67541 或者什么...
在 paintEvent 方法开始时添加调试行:
qDebug() << "size:" << event->rect() << " w:" << width() << " h:" << height();
然后输出显示 GradientWidget 处理了两次 paintEvent:
size: QRect(0,0 442x305) w: 442 h: 305
size: QRect(12,157 418x136) w: 442 h: 305
size: QRect(0,0 444x305) w: 444 h: 305
size: QRect(12,157 420x136) w: 444 h: 305
(我猜,弃用值 12 是 VBoxLayout 的 'margin' 属性?)
而这个'rect()'是用来计算梯度的
临时解决方法可以是:
QLinearGradient gradient({0.0, 0.0}, {static_cast<qreal>(width()), static_cast<qreal>(height())});
通常,QLabel
是用透明背景绘制的。但是,如果 HTML 内容设置为标签文本,它会开始使用父(我猜)背景:
主窗口:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
GradientWidget *widget = new GradientWidget(this);
setCentralWidget(widget);
resize(400, 300);
QVBoxLayout *layout = new QVBoxLayout(widget);
layout->addWidget(new QLabel("Label with a proper (transparent) background", this));
layout->addWidget(new QLabel("<b>HTML</b> label with an <i>improper</i> (inherited from parent) background"));
}
渐变小部件:
class GradientWidget : public QWidget
{
Q_OBJECT
public:
GradientWidget(QWidget *parent = 0) : QWidget(parent) {}
protected:
void GradientWidget::paintEvent(QPaintEvent *event)
{
QLinearGradient gradient(event->rect().topLeft(), event->rect().bottomRight());
gradient.setColorAt(0, Qt::white);
gradient.setColorAt(1, Qt::darkYellow);
QPainter painter(this);
painter.fillRect(event->rect(), gradient);
}
};
我正在使用 Qt 5.2.1 和 Windows 10.
有什么办法可以解决这种奇怪的行为吗?是错误还是功能?
我不确定它是否是错误 - 已在此处报告 QTBUG-67541 或者什么...
在 paintEvent 方法开始时添加调试行:
qDebug() << "size:" << event->rect() << " w:" << width() << " h:" << height();
然后输出显示 GradientWidget 处理了两次 paintEvent:
size: QRect(0,0 442x305) w: 442 h: 305
size: QRect(12,157 418x136) w: 442 h: 305
size: QRect(0,0 444x305) w: 444 h: 305
size: QRect(12,157 420x136) w: 444 h: 305
(我猜,弃用值 12 是 VBoxLayout 的 'margin' 属性?)
而这个'rect()'是用来计算梯度的
临时解决方法可以是:
QLinearGradient gradient({0.0, 0.0}, {static_cast<qreal>(width()), static_cast<qreal>(height())});