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);
}
相关推荐
LXS_35717 小时前
Day 05 C++ 入门 之 指针
开发语言·c++·笔记·学习方法·改行学it
etsuyou19 小时前
js前端this指向规则
开发语言·前端·javascript
shizhenshide19 小时前
为什么有时候 reCAPTCHA 通过率偏低,常见原因有哪些
开发语言·php·验证码·captcha·recaptcha·ezcaptcha
mit6.82419 小时前
[Agent可视化] 配置系统 | 实现AI模型切换 | 热重载机制 | fsnotify库(go)
开发语言·人工智能·golang
友友马19 小时前
『 QT 』QT控件属性全解析 (一)
开发语言·前端·qt
小白学大数据20 小时前
实战:Python爬虫如何模拟登录与维持会话状态
开发语言·爬虫·python
一念&20 小时前
每日一个C语言知识:C 结构体
c语言·开发语言
锦***林20 小时前
用 Python 写一个自动化办公小助手
开发语言·python·自动化
立志成为大牛的小牛1 天前
数据结构——二十六、邻接表(王道408)
开发语言·数据结构·c++·学习·程序人生
祈祷苍天赐我java之术1 天前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap