做了一个系统登录界面,登录背景图是在Qt Designer中设置Stylesheet加载出来的。背景图显示后在背景图相应位置添加用户名,密码,登陆按钮等控件。
现在的问题是:当设置了登陆框为圆角时(styleSheet内容:#LoginDlg{background-image: url(:/Login/Bin/Debug/skins/black/images/loginIcon/login-logo.png);border-radius:20px},背景图被裁剪成圆角了,但整个登陆框并没有剪成圆角,四个角会露出白色部分。
解决方法 1 :
1. 重新做了一个背景图,photoshop编辑背景图radius为20,四个角透明。
2. styleSheet只需要加载背景图
Qss:#LoginDlg{background-image: url(:/Login/login-logo.png);}
3. LoginDlg源程序中获得该背景图
QPixmap pm(":Login/login-logo.png");
// setMask() 设置不规则形状窗体;
LoginDlg->setMask(pm.mask());
或者用颜色
void Widget::resizeEvent(QResizeEvent *e)
{
QWidget::resizeEvent(e);
QSize sz = e->size();
QBitmap mask(sz);
QPainter painter(&mask);
painter.setRenderHint(QPainter::Antialiasing);
painter.fillRect(0, 0, sz.width(), sz.height(), Qt::white);
painter.setBrush(QColor(0, 0, 0));
painter.drawRoundedRect(0, 0, sz.width(), sz.height(), 20, 20);
setMask(mask);
}
因为我的WindowFlags为Qt::FramelessWindowHint,所以不会放大缩小该登陆框。
如果可以放大缩小,应该加上
QPalette pal = this->palette();
pal.setBrush(QPalette::Background,QBrush(pm));
resize(pm.size());
setMask(pm.mask());
解决方法 2:重写paintEvent绘制
给窗体设置WA_TranslucentBackground属性,然后进行重写paintEvent绘制圆角矩形或使用qss
setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);
void Widget::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e)
QPainter p(this);
p.setPen(Qt::NoPen);
p.setBrush(QBrush(QColor(0, 0, 0, 0)));
p.drawRect(rect());
p.setRenderHint(QPainter::Antialiasing);
p.setBrush(palette().color(QPalette::Window));
p.drawRoundedRect(0, 0, width() - 1, height() - 1, 20, 20);
}