Escribí un pequeño diálogo que solo contiene un TableWigdet. ¿Cómo puedo determinar el tamaño horizontal de la tabla? Quiero cambiar el tamaño de la ventana de diálogo para que la tabla se muestre sin una barra de desplazamiento horizontal.Establecer el tamaño óptimo de una ventana de diálogo que contiene un TableWidget
5
A
Respuesta
4
Por lo que sé, no hay una manera fácil de hacerlo. Debe sumar el ancho de las columnas de la tabla y luego agregar espacio para los encabezados. También debe agregar espacio para la barra de desplazamiento vertical y el marco del widget. Esta es una manera de hacerlo,
class myTableWidget(QtGui.QTableWidget):
def sizeHint(self):
width = 0
for i in range(self.columnCount()):
width += self.columnWidth(i)
width += self.verticalHeader().sizeHint().width()
width += self.verticalScrollBar().sizeHint().width()
width += self.frameWidth()*2
return QtCore.QSize(width,self.height())
6
Usted podría utilizar algo por el estilo (comenté lo suficientemente espero):
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyTableWidget(QTableWidget):
def __init__(self, x, y, parent = None):
super(MyTableWidget, self).__init__(x, y, parent)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
# To force the width to use sizeHint().width()
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred)
# To readjust the size automatically...
# ... when columns are added or resized
self.horizontalHeader().geometriesChanged \
.connect(self.updateGeometryAsync)
self.horizontalHeader().sectionResized \
.connect(self.updateGeometryAsync)
# ... when a row header label changes and makes the
# width of the vertical header change too
self.model().headerDataChanged.connect(self.updateGeometryAsync)
def updateGeometryAsync(self):
QTimer.singleShot(0, self.updateGeometry)
def sizeHint(self):
height = QTableWidget.sizeHint(self).height()
# length() includes the width of all its sections
width = self.horizontalHeader().length()
# you add the actual size of the vertical header and scrollbar
# (not the sizeHint which would only be the preferred size)
width += self.verticalHeader().width()
width += self.verticalScrollBar().width()
# and the margins which include the frameWidth and the extra
# margins that would be set via a stylesheet or something else
margins = self.contentsMargins()
width += margins.left() + margins.right()
return QSize(width, height)
Cuando un encabezado de fila cambios, el ancho de la totalidad de los cambios de cabecera verticales, pero no inmediatamente después de que se emita la señal headerDataChanged
.
Es por eso que usé un QTimer
para llamar al updateGeometry
(que debe llamarse cuando cambia sizeHint
) después de que QTableWidget
haya actualizado el ancho del encabezado vertical.
Cuestiones relacionadas
- 1. ¿Cuál es el tamaño óptimo para una aplicación de Android?
- 2. NetBeans (Java Swing): Establecer tamaño de ventana
- 3. Establecer el tamaño mínimo de ventana en C# .NET
- 4. JavaFX ¿Cómo establecer el tamaño máximo/mínimo de la ventana?
- 5. ¿Cómo puedo evitar que una ventana de diálogo se oculte?
- 6. Cómo establecer el tamaño del área No cliente de una ventana Win32 (nativa)
- 7. dd: ¿Cómo calcular el tamaño de bloques óptimo?
- 8. Cómo determinar el tamaño óptimo de la pila de hilos?
- 9. tamaño de una estructura que contiene 1 Puntero
- 10. ¿Cómo establecer la ubicación de una ventana de WPF?
- 11. Evitar que se cambie el tamaño de una ventana SWT horizontalmente
- 12. Hacer un div anidado en un diálogo de interfaz de usuario jQuery cambiar el tamaño con el cuadro de diálogo?
- 13. Cómo calcular el tamaño de porción óptimo para cargar archivos de gran tamaño
- 14. Establecer el progreso del cuadro de diálogo
- 15. Buscar la ventana que contiene una vista en Android
- 16. Tamaño óptimo de las imágenes de fondo en mosaico CSS
- 17. Tamaño óptimo de lectura del búfer de archivos?
- 18. ¿Cómo puedo configurar el tamaño de ventana de una ventana de trazado?
- 19. iterm2 tamaño de ventana predeterminado
- 20. Buscando el tamaño óptimo para BufferedInputStream en Java
- 21. Tamaño óptimo para particiones de bases de datos
- 22. Tamaño JScrollPane que contiene JPanel cuando aparecen barras de desplazamiento
- 23. ¿Diálogo como ventana principal?
- 24. ¿Cómo evitar tener una ventana más pequeña que el tamaño mínimo de un UserControl en WPF?
- 25. Creación de una ventana de trazado de un tamaño particular
- 26. Cómo establecer un fondo de ventana WPF?
- 27. Limitaciones de tamaño de ventana por contenido
- 28. ¿Cómo puedo establecer el tamaño de un botón?
- 29. Cambiar el tamaño de una ventana a un tamaño establecido en Linux
- 30. C# FileStream: Tamaño de búfer óptimo para escribir archivos grandes?
Esto funcionó bien para mí, mientras que la respuesta 'aceptada' no. Una razón puede ser que estoy usando un QTableView que no tiene el método columnCount utilizado en la solución de Mr Terry. Tenga en cuenta que con QTableView necesita configurar el modelo desde el principio en el constructor para que esta solución funcione, ya que utiliza el modelo para indicar si los encabezados cambian. –
Palabra de advertencia: estaba usando esta implementación de 'MyTableWidget' en un diálogo no guardado (por ejemplo, se creó el cuadro de diálogo y salió del alcance en el mismo método), y me dio un' RuntimeError: wrap C/C++ object del tipo MyTableWidget ha sido eliminado' error. Creo que el 'QTimer' estaba tratando de llamar' self.updateGeometry' después de que el widget ya había sido recogido basura (¿es posible?). En cualquier caso, acabo de reemplazar las llamadas a 'self.updateGeometryAsync' con llamadas a la acción' self.updateGeometry' y todavía funcionó bien para mí. – jeremiahbuddha