QToolTip show_time 增加且背景透明度不起作用(PySide6)

问题描述 投票:0回答:1

我有一个

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)
    没有帮助。

那么,我该如何解决这些问题(实现真正的不透明度并增加显示时间)?我真的不喜欢开销很大的解决方案,因为这只是一个工具提示,它不应该“消耗”大量计算源。
但我会很感激任何解决方案。

css python-3.x qt pyqt pyside6
1个回答
0
投票

虽然文档报告

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

请注意:

  • 您应该谨慎使用不透明度值:信息小部件上的奇特效果决不应该妨碍其有效性;避免将不透明度级别设置为小于 210-220;
  • 阴影可能仍会显示,并且不能轻易解决:一种可能性是为图表视图创建一个子类,在
    childEvent()
    中观察抛光事件,使用
    ToolTip
    窗口标志检查 QLabel 小部件,如果未设置,则添加
    Qt.NoDropShadowWindowHint
    窗口标志;
© www.soinside.com 2019 - 2024. All rights reserved.