Ho scritto una piccola finestra di dialogo che contiene solo un TableWigdet. Come posso determinare la dimensione orizzontale del tavolo? Voglio ridimensionare la finestra di dialogo in modo che la tabella sia visualizzata senza una barra di scorrimento orizzontale.Impostare la dimensione ottimale di una finestra di dialogo contenente un TableWidget
5
A
risposta
4
Per quanto ne so, non esiste un modo semplice per farlo. Devi sommare le larghezze delle colonne della tabella e quindi aggiungere spazio per le intestazioni. Devi anche aggiungere spazio per la barra di scorrimento verticale e il riquadro del widget. Ecco un modo per farlo,
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
Si potrebbe usare qualcosa di simile (commentato abbastanza spero):
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)
Quando un'intestazione di riga cambia, la larghezza di tutto il cambiamento di intestazione verticali, ma non subito dopo che il segnale headerDataChanged
è stato emesso.
Ecco perché ho utilizzato uno QTimer
per chiamare lo updateGeometry
(che deve essere chiamato quando cambia sizeHint
) dopo che QTableWidget
ha effettivamente aggiornato la larghezza dell'intestazione verticale.
Problemi correlati
- 1. Come impostare l'icona per la finestra di dialogo in Android
- 2. Come impostare la convalida nulla nella finestra di dialogo edittextpreference
- 3. Python ftplib Dimensione blocco ottimale?
- 4. Dimensione finestra di dialogo Impostazione a livello di programmazione
- 5. Come fare un PreferenceActivity lanciare una finestra di dialogo per impostare una preferenza personalizzata
- 6. gtk visualizzazione di una finestra di dialogo all'interno di una finestra di dialogo
- 7. Come creare una finestra di dialogo con schede Android contenente frammenti?
- 8. Come ottenere la dimensione di una finestra di dialogo personalizzata in Android?
- 9. Mostra una finestra di dialogo in `Thread.setDefaultUncaughtExceptionHandler`
- 10. Come impostare la posizione di una finestra WPF?
- 11. jQuery finestra di dialogo modale e finestra di dialogo CKEditor
- 12. JQGrid all'interno di una finestra di dialogo
- 13. Come abbandonare la trasparenza di una finestra di dialogo PrimeFaces?
- 14. La finestra di dialogo Feed FB.ui richiede redirect_uri, la finestra di dialogo non viene chiusa
- 15. Animazione di una finestra di dialogo personalizzata
- 16. Finestra di Outlook Sfoglia la finestra di dialogo?
- 17. Perché la chiusura di una finestra di dialogo figlio nidificata chiude anche la finestra di dialogo principale?
- 18. come impostare un testo in un Edittext che si trova in una finestra di dialogo?
- 19. Finestra di dialogo dell'interfaccia utente jQuery - La finestra esterna scorre mentre scorre all'interno della finestra di dialogo
- 20. Aggiunta di un frammento a una finestra di dialogo
- 21. Android - MediaController di VideoView all'interno della finestra di dialogo appare dietro la finestra di dialogo
- 22. Apre la finestra di dialogo dalla notifica
- 23. problema con la finestra di dialogo jquery
- 24. La finestra di dialogo modale remota di Bootstrap non funziona
- 25. Come spostare una finestra di dialogo Winform
- 26. Come creare una finestra di dialogo JavaFX?
- 27. Dimensione ottimale del buffer Android
- 28. Icone in una finestra di dialogo Elenco
- 29. dimensione buffer ottimale per la lettura di file in C
- 30. Come impostare la dimensione del carattere per il testo dei pulsanti di dialogo
Questo ha funzionato bene per me, mentre la risposta "accettata" no. Una ragione potrebbe essere che sto usando un QTableView che non ha il metodo columnCount utilizzato nella soluzione di Mr Terry. Si noti che con un QTableView è necessario impostare il modello all'inizio del costruttore affinché questa soluzione funzioni perché utilizza il modello per stabilire se le intestazioni cambiano. –
Word of warning: stavo usando questa implementazione di 'MyTableWidget' in una finestra di dialogo non salvata (ad es. La finestra di dialogo è stata creata ed è uscita dall'ambito nello stesso metodo) e mi stava dando un oggetto' RuntimeError: wrapped C/C++ di tipo MyTableWidget è stato cancellato errore. Penso che il 'QTimer' stava cercando di chiamare' self.updateGeometry' dopo che il widget era già stato eliminato dalla spazzatura (è possibile?). In ogni caso, ho appena sostituito le chiamate a 'self.updateGeometryAsync' con chiamate allo stock' self.updateGeometry' e comunque ha funzionato bene per me. – jeremiahbuddha