0

我有一个 QDial 小部件,我想通过添加一个 QLable 来美化这个小部件的圆形边缘,如下图所示。但是,我认为这使 QLabel 成为父小部件,而 QDial 不再有效!

下面也是我的简单代码。

在此处输入图像描述

from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(200, 200, 500, 500)
        self.UiComponents()
        self.show()

    def UiComponents(self):
        dial = QDial(self)
        dial.setGeometry(150, 150, 200, 200)

        label_1 = QLabel('', self)
        label_1.move(168, 168)
        label_1.resize(164, 164)
        label_1.setStyleSheet("border: 4px solid gray; border-radius: 82px;")

App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
4

1 回答 1

1

“主要”问题是您在表盘上添加标签因此它将无法接收鼠标事件。

理论上的解决方案可能是使用label_1.setAttribute(Qt.WA_TransparentForMouseEvents),但这不是一个好主意,原因如下:

  1. 小部件几何形状通常应该由布局管理器管理,因此您不能依赖通过反复试验完成的“猜测”:一旦调整窗口大小,所有几何形状都会改变,您最终会得到一个浮动圆圈让一切变得更糟;
  2. 即使假设您通过使用事件过滤器拦截 resize 事件来获得正确的定位,您也需要每次手动重置样式表并确保它正确对齐,但这不能保证,因为不同的大小策略和其他小部件可能会改变最终表盘半径;
  3. 由于许多原因,包括当前操作系统和正在使用的 QStyle,您在屏幕上看到的几乎永远不会是用户在他们的屏幕上看到的;请参阅以下使用 3 种 Qt 常用样式(Breeze、Oxygen 和 Windows)截取的屏幕截图:

在此处输入图像描述

不幸的是,QDial 从未得到开发人员的大量关注,因为它是一个很少使用的小部件,很难实现自定义使用。因此,它不支持很多外观特性,也没有样式表配置。

如果你想改变表盘的外观,唯一安全的可能性是继承它,覆盖它paintEvent()并自己绘制它。

于 2021-06-10T14:18:23.250 回答