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);
}
相关推荐
冻柠檬飞冰走茶1 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing031 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊1 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6752 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩3 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11075 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19905 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala
starzy19905 小时前
深入理解Scala递归函数:从栈溢出到尾调用优化
开发语言·scala
三*一5 小时前
Mapbox‑GL JS 多边形折点编辑工具:实现原理、功能拆解与踩坑总结
开发语言·javascript·ecmascript
YSL0701245 小时前
C++基础
开发语言·c++