使用 QLabel 修改 Qdial

Modify Qdial with a QLabel

我有一个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())

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

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

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

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

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