QDialog圆角

做了一个系统登录界面,登录背景图是在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);
}

 

你可能感兴趣的:(Qt)