QT 顶级窗口为QWidget 设置顶级窗口背景无效

今天同事遇到一个问题,就是一个很简单的demo。使用Designer创建了一个顶层窗口QWidget,然后右键设置样式表,将背景设置为红色。这时候看起来一切正常,但是运行起来的时候,背景居然没有更改,也就是设置的CSS样式表并没有生效。

先看一下问题:

1.创建一个叫Form的QWidget窗口。

2.右键设置样式表

#Form
{
	background:red;
}

这时候看起来一切正常:

3.在main函数进行显示

    Form w;
    w.show();

结果却是这样的:


设置了样式表,运行的时候却没生效?是的,结果就是这样的!我们来探究一下为什么会这样?有下面几条结论:

  1. 对于顶层窗口,在Designer中设置的背景样式表默认是不生效的。
  2. 如果设置了顶层窗口的背景 样式表,怎样才能生效呢? 就是在顶层窗口的构造函数中设置属性:
setAttribute(Qt::WA_StyledBackground);

这个属性什么意思呢?我们查阅帮助文档得知,意思就是告诉窗口,应该使用设置的样式表进行渲染控件背景:

设置完后,我们在Designer中设置的关于背景的样式表就会生效:

但是,我们并不建议直接对顶层窗口在Designer中使用样式表,进行背景设置:

原因是:如果顶层窗口设置了窗口背景,若子控件不使用同样的方式来设置样式表,则所有子控件默认继承了顶层窗口的背景。

我们做个例子,在Form的控件上,拖上几个子控件,并不设置子控件的样式表:

 

执行之后的效果呢?

结论:也就说,所有的子控件如果不指定各自的样式表,将默认继承顶层窗口的背景。

 

究竟怎样才能设置一个顶层窗口的背景呢?

方式一:就是上面我们提到的,在Designer中直接指定背景样式表。并在构造函数设置属性:

setAttribute(Qt::WA_StyledBackground);

方式二:在构造函数中使用代码设置样式表

setStyleSheet("background-color:red");

 

方式三:使用QPalette:

m_pWidget = new QWidget(this);
m_pWidget->setGeometry(0, 0, 300, 100);
QPalette pal(m_pWidget->palette());

//设置背景黑色
pal.setColor(QPalette::Background, Qt::red);
m_pWidget->setAutoFillBackground(true);
m_pWidget->setPalette(pal);
m_pWidget->show();

方式四:继承QPaintEvent事件,进行绘图:

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter p(this);
    p.setPen(Qt::NoPen);
    p.setBrush(Qt::red);
    p.drawRect(rect());
}

 

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Qt Designer是一个可视化的界面设计工具,它主要用于设计Qt应用程序的用户界面。在Qt Designer中给QWidget设置背景图片有两种方法。 方法一:使用QPalette设置背景图片 步骤如下: 1. 在Qt Designer中打开你的窗口,选择需要设置背景图片的QWidget。 2. 在属性编辑器中找到palette属性,展开它。 3. 在palette属性中,找到BackgroundImage属性,点击右侧的三个点按钮。 4. 弹出一个文件选择对话框,选择你想要设置背景图片。 5. 点击确定按钮,关闭对话框。 6. 在Qt Designer中选择”文件”->”保存”来保存设置。 7. 运行你的应用程序,可以看到设置背景图片已经显示在QWidget上。 方法二:在代码中设置背景图片 步骤如下: 1. 在Qt Designer中打开你的窗口,选择需要设置背景图片的QWidget。 2. 在属性编辑器中找到objectName属性,记下这个属性值。 3. 关闭Qt Designer,打开你的代码编辑器。 4. 在你的代码中引用QWidget的头文件。 5. 在代码中实例化QWidget对象,并设置其objectName为记下的属性值。 6. 使用QPixmap类加载你想要设置背景图片。 7. 使用QPalette类为QWidget设置背景图片,例如:widget->setAutoFillBackground(true); QPalette palette; palette.setBrush(QPalette::Background, QBrush(pixmap.scaled(widget->size(), Qt::IgnoreAspectRatio))); widget->setPalette(palette); 8. 运行你的应用程序,可以看到设置背景图片已经显示在QWidget上。 以上就是使用Qt Designer给QWidget设置背景图片的两种方法。无论你选择哪种方法,都能实现在Qt应用程序中设置背景图片的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值