[提问]Pyqt5 & Qt designer 圆角出现多余三角?

新手上路,请多包涵

在使用Qt designer&Pyqt5时出现以下问题
设计图
代码(Pycharm):

coding:utf-8

import sys
import os
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QPushButton
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt

def close():

sys.exit(app.exec_())

app = QApplication(sys.argv)
window = QWidget()
loadUi('cf2.ui', window)
window.setWindowFlags(window.windowFlags() | Qt.FramelessWindowHint)
window.setStyleSheet("QWidget { background-color: rgba(0, 0, 0, 0); }")
label_back = window.findChild(QLabel, 'Label_back')

查找名为Label_back的QLabel对象

label_back.setStyleSheet("QLabel#Label_back { background-color: blue;border-radius:30px }")

button_close = window.findChild(QPushButton, 'Button_close')
if button_close:

button_close.clicked.connect(close)

window.show()

sys.exit(app.exec_())
窗口四角出现黑色

我尝试使用
window.setStyleSheet("QWidget { background-color: rgba(0, 0, 0, 0); }")
将父窗口设置为透明
未使用此设置前,四角为白色

阅读 421
avatarAI BotBETA
### 回答

出现这种问题通常是因为在设置窗口透明时,操作系统的窗口管理器绘制了窗口的边框和圆角,而你的 CSS 样式只作用于内容区域。Qt 的 `FramelessWindowHint` 标志会移除默认的窗口边框,但这仍然可能会与操作系统的窗口绘制行为有冲突,尤其是在处理圆角时。

解决方法是:

1. **确保使用正确的 `border-radius` 属性**:你的代码中对 `QLabel#Label_back` 设置了 `border-radius:30px`,这通常没问题,但要确保其他相关元素(如整个窗口或容器)也正确地设置了圆角。

2. **自定义窗口边框**:由于你使用了 `FramelessWindowHint`,你需要自己绘制窗口的边框和圆角。这可以通过在窗口中放置一个覆盖整个窗口大小的容器(比如 `QWidget`),然后对其应用 CSS 样式来实现。

3. **处理透明窗口的背景绘制**:由于你设置了窗口背景为透明,可能需要调整父窗口和子控件的透明度设置,或者使用一个与操作系统绘制兼容的透明度处理方法。

4. **避免使用 `rgba` 在 QWidget**:`QWidget` 对透明度的支持可能不如直接使用图像或更具体的控件来得好。你可以尝试使用一个图像(例如 PNG 格式,包含透明通道)作为背景,而不是设置背景颜色为透明。

5. **调整或禁用窗口阴影**:有时候,操作系统的窗口阴影设置可能会导致在圆角处出现不期望的视觉效果。你可能需要调整或完全禁用这些阴影。

尝试以下修改后的代码段,这里使用一个自定义的容器来管理背景和圆角:

coding:utf-8

import sys
import os
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QPushButton, QVBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt

def close():

app.quit()

app = QApplication(sys.argv)
window = QWidget()
loadUi('cf2.ui', window)
window.setWindowFlags(window.windowFlags() | Qt.FramelessWindowHint)

创建一个容器 QWidget 来管理背景和圆角

container = QWidget(window)
container.setStyleSheet("""

QWidget {
    background-color: blue;
    border-radius: 30px;
}

""")

设置布局和添加容器到窗口

layout = QVBoxLayout(window)
layout.addWidget(container)
layout.setContentsMargins(0, 0, 0, 0)
window.setLayout(layout)

手动加载和调整子控件(例如 label 和 button)到 container 中

这里假设你已经在 Qt Designer 中设计好了界面,并适当地命名了控件

这一步通常是通过 loadUi 自动完成的,但如果有需要,你可以手动调整

示例:假设有一个 label 和一个 button

label = QLabel(container)

label.setObjectName("Label_back")

... 其他 label 设置

button_close = QPushButton(container)

button_close.setObjectName("Button_close")

button_close.clicked.connect(close)

... 其他 button 设置

由于你已经使用 loadUi 加载了 UI,上面的手动创建控件的代码应该被注释掉

只需确保 loadUi 加载的 UI 中的控件被正确地放置在 container 或其他适当的位置

window.show()
sys.exit(app.exec_())


注意:上面的代码是一个示例,并没有完全替换你的代码,因为你需要根据你的具体 UI 设计来调整控件的放置和布局。如果你的 UI 设计比较复杂,可能需要更详细地管理控件的父子关系和布局。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏