我有一个
QChart
,有一些系列。我在 QToolTip
事件之后显示 series.hovered
和当前系列点。这是代码:
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QGraphicsScene, QGraphicsView, QToolTip, QLabel
from PySide6.QtGui import QCursor
from PySide6.QtCore import QPointF
from PySide6.QtCharts import QChart, QLineSeries, QChartView
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget)
chart_view = QChartView()
series = QLineSeries()
series.append(0, 0)
series.append(1, 1)
series.append(2, 4)
series.append(3, 9)
series.hovered.connect(self.show_tooltip)
chart = QChart()
chart.addSeries(series)
chart_view.setChart(chart)
layout = QVBoxLayout(self.central_widget)
layout.addWidget(chart_view)
def show_tooltip(self, point: QPointF, state):
if state:
text = f'{point.x()}\n{point.y()}'
label = QLabel(text)
label.setStyleSheet('background: rgba(255,0,0,55); border: 1px solid #CCCCCC; color: white')
QToolTip.showText(QCursor.pos(), text, label)
else:
QToolTip.hideText()
if __name__ == "__main__":
app = QApplication([])
main_window = MyMainWindow()
main_window.show()
app.exec()
问题如下:
QToolTip
不接受不透明度设置(我在Win11上工作)。
QLabel
具有不透明度,但 QToolTip
带有此标签 - 不透明。rgba(255, 0, 0, 55)
颜色,但工具提示在下面添加了黑色背景)。QToolTip
显示后一秒隐藏。QToolTip.showText(QCursor.pos(), text, label, msecShowTime=10000)
没有帮助。那么,我该如何解决这些问题(实现真正的不透明度并增加显示时间)?我真的不喜欢开销很大的解决方案,因为这只是一个工具提示,它不应该“消耗”大量计算源。
但我会很感激任何解决方案。
虽然文档报告
showText()
的 widget 参数用于指示 rect
参数的参考坐标,但它也用作基础 QTipLabel(私有 QLabel 子类)的构造函数的父级,以防万一它不是被重复利用。
这还具有以下效果:在父级上设置的任何样式表可以影响工具提示。
您的问题是您创建的标签不是持久的:一旦
show_tooltip
返回,它将立即被垃圾收集。
Qt5 和 6 之间的一些代码更改允许仍然显示工具提示(而在 Qt5 中它从未显示,因为小部件正在被销毁),但这并没有改变该标签完全无用的事实。
如果您想显示与特定小部件相关的工具提示,您必须使用该小部件。在你的例子中,它是 QChartView。
然后,如果您想为工具提示设置特定样式,还必须使用适当的样式表选择器(一般来说,应始终避免通用属性)。
最后,Qt 工具提示 do 支持不透明度;事实上,它们是支持 QSS opacity
属性的唯一小部件。
class MyMainWindow(QMainWindow):
def __init__(self):
...
# create a persistent reference to the chart view
self.chart_view = QChartView()
self.chart_view.setStyleSheet('''
QToolTip {
background: red;
border: 1px solid #CCC;
color: white;
opacity: 127;
}
''')
...
def show_tooltip(self, point: QPointF, state):
if state:
QToolTip.showText(
QCursor.pos(),
f'{point.x()}\n{point.y()}',
self.chart_view,
msecShowTime=10000
)
else:
QToolTip.hideText()
请注意:
childEvent()
中观察抛光事件,使用 ToolTip
窗口标志检查 QLabel 小部件,如果未设置,则添加 Qt.NoDropShadowWindowHint
窗口标志;