使用 QLabel 修改 Qdial

问题描述

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

下面也是我的简单代码

enter image description here

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)

        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())

解决方法

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

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

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

enter image description here

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

如果您想更改表盘的外观,唯一安全的可能性是将其子类化,覆盖其 paintEvent() 并自行绘制。