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);
}
相关推荐
222you7 小时前
Java线程的三种创建方式
java·开发语言
云上漫步者7 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——unicode_width完整适配案例
开发语言·后端·rust·harmonyos
漫漫求7 小时前
Java内存模型【JMM】、JVM内存模型
java·开发语言·jvm
田姐姐tmner7 小时前
Python 全面语法指南
开发语言·python
月上林梢7 小时前
QT圆形加载进度条
数据库·c++·qt·进度条
white-persist8 小时前
【攻防世界】reverse | simple-check-100 详细题解 WP
c语言·开发语言·汇编·数据结构·c++·python·算法
wuguan_8 小时前
C#中的静态成员、常量和只读变量
开发语言·c#
张人玉8 小时前
C# 与西门子 PLC 通信:地址相关核心知识点
开发语言·microsoft·c#·plc
Gomiko8 小时前
JavaScript DOM 原生部分(五):事件绑定
开发语言·前端·javascript
lly2024068 小时前
Redis 发布订阅
开发语言