Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题

一、实现窗口背景透明

二、类比拓展(针对TextEdit控件)


一、实现窗口背景透明

默认的窗口样式大家都已习以为常了,令人难免会有自绘窗口的冲动。

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第1张图片

而想要自绘样式的朋友可能会有将窗口背景进行透明化设置的风格需求,比如:

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第2张图片

经过一番百度博文的搜索也能找到实现方法,即在主窗口的构造函数中(或者你自己定义的界面初始化函数里)写上下面这句:

this->setAttribute(Qt::WA_TranslucentBackground, true);

没错,这样的的确确可以使窗口透明,但现在往往看到的是下面这种情况:

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第3张图片

会发现窗口内一片黢黑,说好的透明呢?其实,它确实是透明了,不信可以试着改变一下透明度,会发现你要设定的颜色若隐若现。下面我于重写的paintEvent(QPaintEvent *event)函数里用画刷QBrush进行填充颜色的透明度设置,可以看到很明显的改变:

 QColor(9,151,247,100) → QColor(9,151,247,180) → QColor(9,151,247,240)  (即透明度从100→180→240)

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第4张图片Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第5张图片Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第6张图片

总之,只要存在透明度,所呈现的颜色就会比其原色或多或少“黯淡”那么一些,换句话说,就好比底色就是固定不变的黑色,我设置的颜色只是覆盖在上面罢了。这该如何解决呢,其实这个黑色的“底色”是窗口默认标题栏所带来的副作用,我们加上下面这句去掉默认标题栏再来试试:

this->setWindowFlags(Qt::FramelessWindowHint); //目前无其他需求,暂且只写这一个参数

看看效果(拿QColor(9,151,247,180)举例):

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第7张图片(后面是我桌面背景)Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第8张图片(后面是白色背景)

可以发现不只标题栏,那层黢黑的“底色”也已消除。

 

二、类比拓展(针对TextEdit控件)

继续在窗口添加一个TextEdit控件:

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第9张图片

当然,一开始加在上面的任何控件都不会随主窗口透明而透明,不过上面这个效果的确很突兀,如果要将TextEdit控件的输入背景也设置为一种透明的颜色,方便的做法便可以直接用qss控制:

#textEdit{
	background:transparent;
}

然而应用后会发现,编辑框的输入背景还是白色,这就和上一个问题类似:

设置主窗口透明(this->setAttribute(Qt::WA_TranslucentBackground, true);)会暴露出来这些控件的“底色”,主窗口的“底色”是黑色,而TextEdit的“底色”便是白色,主窗口的“底色”是其默认标题栏的副作用,而TextEdit的“底色”则是其边框的副作用,加上下面这句话便可去除,实现其输入背景的透明:

ui->textEdit->setFrameStyle(0); //这里是在UI设计上加的TextEdit控件,所以前有ui指针

Qt关于实现自定义标题栏/窗口时遇到的背景透明化无效问题_第10张图片

你可能感兴趣的:(Qt)