es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo mostrar un pyqtgraph.TextItem sobre todos los demás elementos en una escena?

Estoy intentando hacer que una etiqueta InfiniteLine aparezca sobre todos los demás elementos en una escena de pyqtgraph. Estoy configurando el zValue de la etiqueta en 1 y todos los demás en 0. A pesar de esto, la etiqueta todavía aparece debajo de otros elementos en la escena. Aquí hay un ejemplo mínimo donde la etiqueta para el InfiniteLine aparece debajo del LinearRegionItem a pesar de tener un zValue más alto.

from pyqtgraph import GraphicsLayoutWidget, PlotItem, InfiniteLine, LinearRegionItem, mkQApp

<h1>app</h1>

app = mkQApp()

<h1>items</h1>

line = InfiniteLine(pos=5, label="posición: {valor}", movable=True)
region = LinearRegionItem(values=(6, 10), movable=True, pen="red", brush="red")

<h1>plot</h1>

plot = PlotItem()
plot.setXRange(0, 20)
plot.addItem(line)
plot.addItem(region)

<h1>widget</h1>

widget = GraphicsLayoutWidget()
widget.addItem(plot, 0, 0)
widget.show()

<h1>set zvalues</h1>

line.setZValue(0)
region.setZValue(0)
line.label.setZValue(1)

<h1>run</h1>

app.exec()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que establecer solo el zValue de la etiqueta InfiniteLine no es suficiente para asegurar que aparezca sobre todos los demás elementos en la escena. Una posible solución es establecer el zValue del PlotItem en sí mismo a un valor negativo, lo cual asegurará que cada elemento agregado a la escena aparezca por encima de él. Aquí está el código modificado:

    from pyqtgraph import GraphicsLayoutWidget, PlotItem, InfiniteLine, LinearRegionItem, mkQApp
    
    # app
    app = mkQApp()
    
    # elementos
    line = InfiniteLine(pos=5, label="posición: {value}", movable=True)
    region = LinearRegionItem(values=(6, 10), movable=True, pen="red", brush="red")
    
    # gráfico
    plot = PlotItem()
    plot.setXRange(0, 20)
    plot.addItem(line)
    plot.addItem(region)
    plot.setZValue(-10)  # establecer el zValue del PlotItem en sí mismo a un valor negativo
    
    # widget
    widget = GraphicsLayoutWidget()
    widget.addItem(plot, 0, 0)
    widget.show()
    
    # establecer zvalues
    line.setZValue(0)
    region.setZValue(0)
    line.label.setZValue(1)
    
    # ejecutar
    app.exec()
    

    Con esta modificación, ahora la etiqueta para InfiniteLine aparece sobre LinearRegionItem.

Comments are closed.