QT入门:怎么写无边框(标题栏)的窗口、透明窗口、圆角控件

本文介绍如何在QT中实现窗口的透明效果、去除边框以及制作圆角控件等美化GUI的方法。包括设置透明度、隐藏标题栏、背景颜色配置及圆角样式设置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自http://wangbaiyuan.cn/432.html

对于QT的初学者来说,去除边框,实现窗口透明度可能是美化GUI的基本要求,笔者综合了网上的代码,进行了总结:

无边框(标题栏)的窗口

 //无边框(标题栏)的窗口
QApplication a(argc, argv); 
 MainWindow w; 
 w.setWindowOpacity(1);
 w.setWindowFlags(Qt::FramelessWindowHint);
 w.setAttribute(Qt::WA_TranslucentBackground);
 w.show();

setWindowOpacity(1)这一句代码实现窗口的透明效果,函数里面的参数是透明度,1表示不透明

setWindowFlags(Qt::FramelessWindowHint);隐藏窗口的标题栏和边框

背景刷成黑色,前景色设为白色。

 方法一、paltette方式,经测试,该方法不会影响到其他控件,推荐使用 

QPalette bgpal = palette();
bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));
//bgpal.setColor (QPalette::Background, Qt::transparent);
bgpal.setColor (QPalette::Foreground, QColor (255,255,255,255)); 
setPalette (bgpal);

方法二、stylesheet方式 影响子控件的方法是:

setStyleSheet ("background-color: rgb(0,0,0);color: rgb(255,255,255);");

不影响子控件的方法是:

setStyleSheet ("venus--TitleBar {background-color: rgb(0,0,0);color: rgb(255,255,255);}");

 

圆角控件 用stylesheet方式

setStyleSheet ("border-radius:10px;");

  圆角窗口 

RoundRectWin::RoundRectWin() { QPalette p = palette(); QPixmap img("roundrect.png");
    QBitmap mask("roundrect_mask.png");
    p.setBrush(QPalette::Window, QBrush(img));
    setPalette(p);
    setMask(mask);
    resize(img.size());
    //setWindowFlags(Qt::FramelessWindowHint);//这句会去掉标题栏 } 注意:mask的图多余部分设为白色

 

半透明窗口

  1.  窗口整体透明,但是窗体上的控件不透明。 通过设置窗体的背景色来实现,将背景色设置为全透。 试验效果:

     

     QPalette pal = palette(); 
    pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); setPalette(pal);

    窗体标题栏不透明;

      窗体客户区上的控件不透明,QLabel控件只是字显示,控件背景色透明; 窗体客户区完全透明。

      另外从网上看到的方法:

     setAttribute(Qt::WA_TranslucentBackground, true);

    试验的结果是类似于上面的方法,但有时候窗体会被一些杂色斑点填充,未找到原因。

  2. 窗口及其上面的控件都半透明:

    setWindowOpacity(0.7)

    试验效果:窗口及控件都半透明。注意不能够setWindowFlags(Qt::FramelessWindowHint);要不就不起作用

  3. 窗口整体不透明,局部透明:

    在Paint事件中使用Clear模式绘图。

    void TestWindow::paintEvent( QPaintEvent* ) 
    { QPainter p(this); 
     p.setCompositionMode( QPainter::CompositionMode_Clear );
     p.fillRect( 10, 10, 300, 300, Qt::SolidPattern );
     } 

    试验效果:绘制区域全透明。如果绘制区域有控件不会影响控件。

    以上实验均是基于Directfb的Qte测试。在Linux下及Windows下效果会略有不同。 比如在Windows下第3个实验,绘制区域就是一个黑窟窿,如果Window本身半透,则是Window下面的内容加上半透效果,不是全透明效果。


<think>好的,用户想了解如何在Qt中实现无边框圆角窗口。我需要先回忆一下相关的知识,确保自己记得正确的步骤和方法。 首先,用户提到了无边框窗口设计,所以应该想到设置窗口标志为FramelessWindowHint。这会去掉标题栏边框,但需要自己处理窗口移动和关闭等功能。 接下来是圆角效果。通常的做法是使用样式表(QSS)来设置边框半径,但要注意的是,直接对主窗口应用border-radius可能不起作用,因为默认的窗口背景可能是空白。需要确保背景色或图片填充,使圆角可见。可能需要设置QWidget的background-color,并且在样式表中设置border-radius和overflow:hidden,以防止子组件超出圆角区域。 然后,可能要考虑阴影效果,因为无边框窗口通常没有阴影,看起来可能不够立体。可以使用QGraphicsDropShadowEffect来添加阴影,但要注意阴影会和圆角配合,可能需要调整偏移量和模糊半径。 另外,还要处理窗口的拖动功能。因为去除了标题栏,用户无法通过标题栏拖动窗口,所以需要在鼠标事件中自己实现拖动逻辑。比如在mousePressEvent和mouseMoveEvent中检测鼠标按下时的位置,然后移动窗口。 还有可能遇到的问题是,子控件或布局的边距,圆角可能会被覆盖,需要确保子控件适当内缩,或者设置父窗口的自动填充背景为true,避免背景穿透。 可能用户还会关心不同平台下的表现,比如Windows和macOS下阴影和圆角的差异,可能需要平台特定的调整。或者是否需要处理高DPI缩放,确保圆角在高分辨率下显示正确。 另外,用户可能需要示例代码来演示这些步骤,所以应该准备一个简单的例子,包括设置无边框、样式表圆角、阴影效果和拖动功能。同时要提醒注意事项,比如子控件不要超出圆角区域,可能需要设置mask,但使用样式表的border-radius通常更高效。 最后,检查是否有遗漏的部分,比如窗口的关闭按钮可能需要自定义,或者最小化、最大化按钮的实现。不过用户的问题主要集中在圆角窗口的实现,可能不需要详细讲解按钮部分,但可以简要提及需要自己添加这些控件。 总结一下,回答的步骤应该是: 1. 设置窗口边框。 2. 应用样式表实现圆角。 3. 添加阴影效果。 4. 实现窗口拖动功能。 5. 注意事项和常见问题。</think>在 Qt 中实现无边框圆角窗口需要结合**窗口属性设置**和**样式表(QSS)**,以下是详细步骤和注意事项: --- ### 1. 设置无边框窗口 ```cpp // 在构造函数中移除默认边框 setWindowFlags(Qt::FramelessWindowHint); // 确保背景透明(可选,视设计需求) setAttribute(Qt::WA_TranslucentBackground); ``` --- ### 2. 通过样式表实现圆角 ```cpp // 设置窗口主体的圆角样式(假设主窗口类名为 QWidget) setStyleSheet(R"( QWidget { background: #FFFFFF; /* 背景色 */ border-radius: 15px; /* 圆角半径 */ border: 2px solid #CCCCCC;/* 可选边框 */ } )"); ``` #### 关键点: - **子控件穿透问题**:如果子控件(如按钮)超出圆角区域,需设置 `QWidget { overflow: hidden; }`。 - **背景填充**:若未设置背景色,圆角可能不生效(透明区域显示直角)。 --- ### 3. 添加阴影效果(可选) ```cpp QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this); shadow->setBlurRadius(20); // 阴影模糊半径 shadow->setColor(Qt::gray); // 阴影颜色 shadow->setOffset(0, 0); // 阴影偏移量 this->setGraphicsEffect(shadow); // 应用阴影 ``` --- ### 4. 实现窗口拖动功能 ```cpp // 重鼠标事件实现拖动 void YourWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_dragPosition = event->globalPos() - frameGeometry().topLeft(); event->accept(); } } void YourWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { move(event->globalPos() - m_dragPosition); event->accept(); } } ``` --- ### 5. 完整代码示例 ```cpp class RoundedWindow : public QWidget { public: RoundedWindow(QWidget *parent = nullptr) : QWidget(parent) { setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground); // 设置圆角样式 setStyleSheet(R"( QWidget { background: #FFFFFF; border-radius: 15px; } )"); // 添加阴影 QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this); shadow->setBlurRadius(20); shadow->setColor(Qt::gray); this->setGraphicsEffect(shadow); // 添加关闭按钮(示例) QPushButton *closeBtn = new QPushButton("×", this); connect(closeBtn, &QPushButton::clicked, this, &QWidget::close); } protected: void mousePressEvent(QMouseEvent *event) override { /* 拖动代码 */ } void mouseMoveEvent(QMouseEvent *event) override { /* 拖动代码 */ } private: QPoint m_dragPosition; }; ``` --- ### 常见问题 1. **圆角锯齿**:确保开启抗锯齿(默认启用),检查样式表是否正确应用。 2. **子控件直角溢出**:在布局中设置 `layout->setContentsMargins(5,5,5,5);` 留出边距。 3. **性能问题**:避免频繁重绘,复杂场景建议使用 `QPainterPath` 绘制自定义形状。 通过以上步骤,即可实现美观的无边框圆角窗口,适用于自定义弹窗、浮层等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值