2011-07-08 19 views
7

Tengo un problema con la barra de desplazamiento horizontal QTreeView, no aparece. Establecí la política de barra de desplazamiento horizontal en ScrollBarAsNeeded, pero no aparece si es necesario. Han tratado de conectar expansión y de compresión de señales a una ranura:Problemas QTreeView Horizontal Scrollbar

connect(this, SIGNAL(expanded(QModelIndex)), this, SLOT(update_scroll_area(QModelIndex))); 
connect(this, SIGNAL(collapsed(QModelIndex)), this, SLOT(update_scroll_area(QModelIndex))); 

La ranura consiste en una línea de código:

update_scroll_area(const QModelIndex& i) 
{ 
    resizeColumnToContents(i.column()); 
} 

Esto hace que la barra de desplazamiento de trabajo, pero sólo cuando estoy expandir/colapsar la elementos de vista de árbol.

Necesito tener la barra de desplazamiento horizontal activa "cada vez", desde el inicio de la aplicación hasta su finalización. ¿Cómo se puede organizar?

Gracias.

Respuesta

11

This FAQ entry pueden ayudar.

En pocas palabras:

  • Establecer la cabecera horizontal para cambiar el tamaño al contenido de la columna (esto se aplica incluso si el encabezado está oculta)
  • Desactivar la propiedad 'stretchLastHeaderSection' para evitar la cabecera horizontal desde el cambio de tamaño automáticamente al ancho de la ventana (que parece anular la configuración anterior para redimensionar el tamaño de la columna)
+0

Esto solo funcionará si se llama a "setModel" antes de los métodos "resize to content" y "stretchLastHeaderSection". – Prady

2

lo que funcionó para mí fue:

  • Establezca la propiedad horizontalScrollBarPolicy en ScrollBarAsNeeded.
  • Establezca la propiedad headerMinimumSectionSize del encabezado horizontal con el mismo valor que el valor 'Anchura geometría'.
  • Establezca la propiedad headerDefaultSectionSize del encabezado horizontal en aproximadamente el doble del valor headerMinimumSectionSize.
  • Deshabilite la propiedad headerStretchLastSection del encabezado horizontal (como se describe en otra parte).

Lo hice usando Qt Designer en el formulario que estaba modificando.

1

si utiliza QT5 intentar esto para hacer treewidget "horizontal" desplazamiento automático:

  • Desactivar headerStretchLastSection de la cabecera horizontal. y
  • ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
0

acabo de descubrir otro caso en barra de desplazamiento horizontal no se mostrará en la clase treeView personalizado. Es entonces cuando establece "setHeaderHidden()" en verdadero & no anule resizeEvent(). Esto es exactamente lo que me sucedió & sobreescribo resizeEvent() llamando a la ranura, resizeColumnToContents (0) ya que solo tengo una columna en mi clase de vista de árbol personalizada para que funcione la barra de desplazamiento horizontal.

Pensé que esto podría ser útil para alguien.

0

En mi opinión, el comportamiento predeterminado QTreeWidget de truncar los elementos del árbol con una elipse sufijación (es decir, "...") en lugar de mostrar una barra de desplazamiento horizontal es una locura, inútil y no lo que nadie quiere. Pero es lo que tenemos.

El siguiente PySide2 específica QTreeWidget subclase aborda con inteligencia esta deficiencia en forma de columna de escala basada en el número de columnas en el árbol actual:

from PySide2.QtWidgets import QHeaderView, QTreeWidget 

class QScrollableTreeWidget(QTreeWidget): 
    ''' 
    :mod:`QTreeWidget`-based widget marginally improving upon the stock 
    :mod:`QTreeWidget` functionality. 

    This application-specific widget augments the stock :class:`QTreeWidget` 
    with additional support for horizontal scrollbars, automatically displaying 
    horizontal scrollbars for all columns whose content exceeds that column's 
    width. For unknown reasons, the stock :class:`QTreeWidget` intentionally 
    omits this functionality. 
    ''' 

    def __init__(self, *args, **kwargs) -> None: 
     super().__init__(*args, **kwargs) 

     # Header view for this tree. 
     header_view = self.header() 

     # To display a horizontal scrollbar instead of an ellipse when resizing 
     # a column smaller than its content, resize that column's section to its 
     # optimal size. For further details, see the following FAQ entry: 
     #  https://wiki.qt.io/Technical_FAQ#How_can_I_ensure_that_a_horizontal_scrollbar_and_not_an_ellipse_shows_up_when_resizing_a_column_smaller_than_its_content_in_a_QTreeView_.3F 
     header_view.setSectionResizeMode(QHeaderView.ResizeToContents) 

     # By default, all trees contain only one column. Under the safe 
     # assumption this tree will continue to contain only one column, prevent 
     # this column's content from automatically resizing to the width of the 
     # viewport rather than this column's section (as requested by the prior 
     # call). This unfortunate default overrides that request. 
     header_view.setStretchLastSection(False) 

    def setColumnCount(self, column_count: int) -> None: 
     super().setColumnCount(column_count) 

     # If this tree now contains more than one column, permit the last such 
     # column's content to automatically resize to the width of the viewport. 
     if column_count != 1: 
      self.header().setStretchLastSection(True) 

En teoría, esta aplicación debe ser trivialmente regrabable en tanto PyQt5 y C++. Porque Qt se merece algo mejor que los incumplimientos evidentemente poco inteligentes.

Cuestiones relacionadas