Qt圆角窗口

Qt圆角窗口

问题:自己重写了一个窗口,发现用qss设置圆角了,但是都不生效,不过子窗口圆角都生效了。

无边框移动窗口

cpp 复制代码
bool eventFilter(QObject *watched, QEvent *evt) {
    static QPoint mousePoint;
    static bool mousePressed = false;

    QMouseEvent *event = static_cast<QMouseEvent *>(evt);
    if (event->type() == QEvent::MouseButtonPress) {
        if (event->button() == Qt::LeftButton) {
            mousePressed = true;
            mousePoint = event->globalPos() - this->pos();
            return true;
        } else {
            return true;
        }
    } else if (event->type() == QEvent::MouseButtonRelease) {
        mousePressed = false;
        return true;
    } else if (event->type() == QEvent::MouseMove) {
        if (mousePressed && (event->buttons() && Qt::LeftButton)) {
            this->move(event->globalPos() - mousePoint);
            return true;
        }
    }
    return QWidget::eventFilter(watched, event);
}

1.当前窗口背景隐藏,使用子窗口圆角

红色背景为原来的窗口,里面的子窗口可以看到有圆角窗口了,隐藏掉就行setAttribute(Qt::WA_TranslucentBackground);

实现效果:

窗口还是存在的,只是透明了

代码:

cpp 复制代码
void StyleSheetWidget::setRoundedRectangle1()
{
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);//隐藏背景

    this->resize(200, 200);

    QFrame* title = new QFrame;
    QWidget* left = new QWidget;
    QWidget* mid = new QWidget;
    QWidget* right = new QWidget;

    // 布局
    QVBoxLayout *layoutMain = new QVBoxLayout;
    layoutMain->setContentsMargins(10, 10, 10, 10);

    QVBoxLayout *midLayout = new QVBoxLayout;
    midLayout->setContentsMargins(0,0,0,0);
    QWidget* midWid = new QWidget;
    midWid->setLayout(midLayout);

    layoutMain->addWidget(midWid);

    QHBoxLayout *hLayout_1 = new QHBoxLayout;
    hLayout_1->addWidget(left);
    hLayout_1->addWidget(mid);
    hLayout_1->addWidget(right);
    midLayout->addWidget(title);
    midLayout->addLayout(hLayout_1);

    title->setStyleSheet("background-color:green;border-bottom:3px solid black;");
    left->setStyleSheet("background-color:green;");
    mid->setStyleSheet("background-color:yellow;");
    right->setStyleSheet("background-color:blue;color:white");

    QLabel* label = new QLabel();
    label->setText("你好啊");
    QFormLayout* formLayout = new QFormLayout;
    formLayout->addRow(label);
    formLayout->addRow(new QLabel("你真的好啊,白云"));
    right->setLayout(formLayout);

    this->setLayout(layoutMain);

    this->setStyleSheet("border-radius: 8px;background-color:red;border: 1px solid #d9d9d9;");
}

2.使用paintEvent()绘制圆角

注意:使用paintEvent绘制圆角时候,布局之间要留一点距离,不然上层的绘制会把下面绘制的圆角给遮住了。如:

cpp 复制代码
layoutMain->setContentsMargins(10,10,10,10);

设置布局间距离为10的效果:

设置为0效果:

cpp 复制代码
    QVBoxLayout *layoutMain = new QVBoxLayout;
    layoutMain->setContentsMargins(0,0,0,0);

代码:

cpp 复制代码
void StyleSheetWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(QColor(255,255,255));      //背景颜色
    //painter.setPen(Qt::red);//Qt::transparent); //边框颜色
    QPen pen;
    pen.setColor(Qt::red);
    pen.setWidth(3);
    painter.setPen(pen);
    QRect rect = this->rect();
    rect.setWidth(rect.width());
    rect.setHeight(rect.height());
    painter.drawRoundedRect(rect, 15, 15);
    QWidget::paintEvent(event);
}
相关推荐
Zenova EdgeOS23 分钟前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
君顾11 小时前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
小羊没烦恼!2 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
程序猿编码2 小时前
两张 3090 扛 27B:Qwen3.8-27B 大模型 DFlash2 加速版生产级落地
开发语言·gpt·深度学习·神经网络·大模型·qwen
welfare9622 小时前
新号别搞:内存管理+模板初阶+STL简介
开发语言·c++
敲代码的瓦龙2 小时前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio
白远山2 小时前
智慧场馆解决方案软件开发实战:从架构设计到落地部署指南
java·开发语言·架构·需求分析
IT笔记3 小时前
Rust 迭代器多级链式调用执行顺序笔记
开发语言·笔记·rust
雪落漂泊3 小时前
C++11(上)
开发语言·c++
春涧草茶3 小时前
慢就是快12-2三种访问权限|getter与setter|魔法方法
开发语言·python