Saat ini saya memiliki QScrollArea yang ditentukan oleh:
self.results_grid_scrollarea = QScrollArea()
self.results_grid_widget = QWidget()
self.results_grid_layout = QGridLayout()
self.results_grid_layout.setSizeConstraint(QLayout.SetMinAndMaxSize)
self.results_grid_widget.setLayout(self.results_grid_layout)
self.results_grid_scrollarea.setWidgetResizable(True)
self.results_grid_scrollarea.setWidget(self.results_grid_widget)
self.results_grid_scrollarea.setViewportMargins(0,20,0,0)
yang dengan senang hati bersarang di dalam tata letak/widget lain, mengubah ukuran seperti yang diharapkan, dll.
Untuk memberikan judul kolom kisi, saya menggunakan QGridLayout lain yang diposisikan tepat di atas area gulir - ini berfungsi... tetapi terlihat sedikit aneh, bahkan ketika ditata dengan tepat, terutama ketika bilah gulir sesuai permintaan (vertikal) muncul atau menghilang sesuai kebutuhan dan header tidak lagi sejajar dengan kolom grid. Itu hal estetis yang saya tahu... tapi saya agak pemilih ;)
Widget lain ditambahkan/dihapus ke self.results_grid_layout
secara terprogram di tempat lain. Baris terakhir di atas baru saja saya tambahkan karena menurut saya akan mudah menggunakan area margin yang dibuat, dokumen untuk status setViewportMargins:
Menetapkan margin di sekitar area gulir. Ini berguna untuk aplikasi seperti spreadsheet dengan baris dan kolom "terkunci". Ruang marginal dibiarkan kosong; letakkan widget di area yang tidak digunakan.
Namun seumur hidup saya tidak dapat menemukan cara untuk mencapai hal ini, dan GoogleFu saya telah meninggalkan saya hari ini, atau hanya ada sedikit informasi/contoh di luar sana tentang cara untuk mencapai hal ini.
Kepala saya memberi tahu saya bahwa saya hanya dapat menetapkan satu widget, dikontrol oleh tata letak (berisi sejumlah widget lain) ke area gulir - seperti yang telah saya lakukan. Jika saya menambahkan QHeaderview misalnya ke baris 0 dari gridlayout, itu hanya akan muncul di bawah margin viewport dan gulir dengan tata letak lainnya? Atau apakah saya melewatkan sesuatu dan tidak dapat melihat kayu di pepohonan?
Saya baru belajar Python/Qt, jadi bantuan, petunjuk, dan/atau contoh apa pun (lebih disukai dengan Python tetapi tidak penting) akan dihargai!
Sunting: Setelah mengikuti saran yang diberikan sejauh ini (menurut saya), saya membuat program pengujian kecil berikut untuk mencobanya:
import sys
from PySide.QtCore import *
from PySide.QtGui import *
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setMinimumSize(640, 480)
self.container_widget = QWidget()
self.container_layout = QVBoxLayout()
self.container_widget.setLayout(self.container_layout)
self.setCentralWidget(self.container_widget)
self.info_label = QLabel(
"Here you can see the problem.... I hope!\n"
"Once the window is resized everything behaves itself.")
self.info_label.setWordWrap(True)
self.headings_widget = QWidget()
self.headings_layout = QGridLayout()
self.headings_widget.setLayout(self.headings_layout)
self.headings_layout.setContentsMargins(1,1,0,0)
self.heading_label1 = QLabel("Column 1")
self.heading_label1.setContentsMargins(16,0,0,0)
self.heading_label2 = QLabel("Col 2")
self.heading_label2.setAlignment(Qt.AlignCenter)
self.heading_label2.setMaximumWidth(65)
self.heading_label3 = QLabel("Column 3")
self.heading_label3.setContentsMargins(8,0,0,0)
self.headings_layout.addWidget(self.heading_label1,0,0)
self.headings_layout.addWidget(self.heading_label2,0,1)
self.headings_layout.addWidget(self.heading_label3,0,2)
self.headings_widget.setStyleSheet(
"background: green; border-bottom: 1px solid black;" )
self.grid_scrollarea = QScrollArea()
self.grid_widget = QWidget()
self.grid_layout = QGridLayout()
self.grid_layout.setSizeConstraint(QLayout.SetMinAndMaxSize)
self.grid_widget.setLayout(self.grid_layout)
self.grid_scrollarea.setWidgetResizable(True)
self.grid_scrollarea.setWidget(self.grid_widget)
self.grid_scrollarea.setViewportMargins(0,30,0,0)
self.headings_widget.setParent(self.grid_scrollarea)
### Add some linedits to the scrollarea just to test
rows_to_add = 10
## Setting the above to a value greater than will fit in the initial
## window will cause the lineedits added below to display correctly,
## however - using the 10 above, the lineedits do not expand to fill
## the scrollarea's width until you resize the window horizontally.
## What's the best way to fix this odd initial behaviour?
for i in range(rows_to_add):
col1 = QLineEdit()
col2 = QLineEdit()
col2.setMaximumWidth(65)
col3 = QLineEdit()
row = self.grid_layout.rowCount()
self.grid_layout.addWidget(col1,row,0)
self.grid_layout.addWidget(col2,row,1)
self.grid_layout.addWidget(col3,row,2)
### Define Results group to hold the above sections
self.test_group = QGroupBox("Results")
self.test_layout = QVBoxLayout()
self.test_group.setLayout(self.test_layout)
self.test_layout.addWidget(self.info_label)
self.test_layout.addWidget(self.grid_scrollarea)
### Add everything to the main layout
self.container_layout.addWidget(self.test_group)
def resizeEvent(self, event):
scrollarea_vpsize = self.grid_scrollarea.viewport().size()
scrollarea_visible_size = self.grid_scrollarea.rect()
desired_width = scrollarea_vpsize.width()
desired_height = scrollarea_visible_size.height()
desired_height = desired_height - scrollarea_vpsize.height()
new_geom = QRect(0,0,desired_width+1,desired_height-1)
self.headings_widget.setGeometry(new_geom)
def main():
app = QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()
if __name__ == '__main__':
main()
Apakah sesuatu seperti ini adalah metode yang Anda maksudkan? Semuanya berfungsi seperti yang diharapkan persis seperti yang saya cari, kecuali beberapa perilaku awal yang aneh sebelum jendela diubah ukurannya oleh pengguna, setelah ukurannya diubah, semuanya berbaris dan baik-baik saja. Saya mungkin terlalu banyak berpikir lagi atau setidaknya mengabaikan sesuatu... ada pemikiran?
grid_layout.setSizeConstraint
, sepertinya menyelesaikan masalah. - person ekhumoro   schedule 24.02.2012