2016-06-29 40 views
5

Tôi đang phát triển một ứng dụng máy tính với PySide và tôi đang sử dụng QTableWidget. Giả sử bảng của tôi có 3 cột, nhưng dữ liệu chúng chứa rất khác nhau, giống như (đối với mỗi hàng) một câu dài trong cột đầu tiên, sau đó là số có 3 chữ số trong hai cột cuối cùng. Tôi muốn để đổi kích thước bảng của tôi để điều chỉnh kích thước của nó thành dữ liệu hoặc ít nhất để có thể để đặt kích thước cột là (nói) 70/15/15% dung lượng có sẵn.PySide - PyQt: Làm thế nào để thiết lập chiều rộng cột QTableWidget như tỷ lệ của không gian có sẵn?

Cách tốt nhất để làm điều này là gì?

Tôi đã thử table.horizontalHeader().setResizeMode(QHeaderView.Stretch) sau khi đọc this question nhưng nó làm cho 3 cột có cùng kích thước.

Tôi cũng đã thử table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents) nhờ Fabio 's comment nhưng không lấp đầy tất cả dung lượng trống khi cần.

Cả Interactive, Fixed, Stretch, ResizeToContents từ QHeaderView documentation dường như để cho tôi những gì tôi cần (xem chỉnh sửa thứ hai).

Bất kỳ trợ giúp nào sẽ được đánh giá cao, ngay cả khi nó là dành cho Qt/C++! Cảm ơn nhiều.


EDIT: tôi thấy loại một cách giải quyết nhưng nó vẫn không phải những gì tôi đang tìm kiếm:

header = table.horizontalHeader() 
header.setResizeMode(QHeaderView.ResizeToContents) 
header.setStretchLastSection(True) 

Sẽ tốt hơn nếu có tồn tại một phương pháp setStretchFirstSection, nhưng tiếc là có không dường như không phải là một.


EDIT 2:

Điều duy nhất có thể được sửa đổi trong bảng là cột cuối cùng, người dùng có thể nhập một số trong đó. Mũi tên màu đỏ biểu thị những gì tôi muốn có.

Đây là những gì xảy ra với StretchStretch

Đây là những gì xảy ra với ResizeToContentsResizeToContents

+0

Hãy thử QHeaderView.ResizeToContents thay vì QHeaderView.Stretch – Fabio

+0

Công trình này hoạt động nhưng không hoàn toàn là những gì tôi đang tìm kiếm, vì với 'ResizeToContents', vì các cột của tôi không đủ lớn, chúng không lấp đầy khoảng trống. Tôi sẽ chỉnh sửa để nó trở nên rõ ràng hơn. – BusyAnt

Trả lời

10

Điều này có thể được giải quyết bằng cách đặt chế độ thay đổi kích thước cho mỗi cột. Phần đầu tiên phải căng ra để đưa lên không gian có sẵn, trong khi hai phần cuối cùng chỉ thay đổi kích thước để nội dung của họ:

PyQt4:

header = self.table.horizontalHeader() 
header.setResizeMode(0, QtGui.QHeaderView.Stretch) 
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents) 

PyQt5:

header = self.table.horizontalHeader()  
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) 
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) 
+0

Tôi không biết rằng tôi có thể chọn một 'QHeaderView' khác cho mỗi cột. Điều này làm việc tốt, mặc dù tôi đã thay đổi thành 'Fixed' cho hai cột cuối cùng và sau đó thêm chiều rộng tối thiểu với' self.table.setColumnWidth (chỉ mục, chiều rộng) '(phù hợp hơn với trường hợp của tôi) – BusyAnt

+2

Trong qt5 chức năng này được đổi thành setSectionResizeMode() –

2

Bạn có thể làm điều này với QItemDelegates hoặc QStyledItemDelegates. Nếu bạn muốn đổi kích thước thành nội dung có độ căng tự động, bạn sẽ cần phải chọn cột nào là cột "kéo dài".

class ResizeDelegate(QStyledItemDelegate): 

    def __init__(self, table, stretch_column, *args, **kwargs): 
     super(ResizeDelegate, self).__init__(*args, **kwargs)   
     self.table = table 
     self.stretch_column = stretch_column 

    def sizeHint(self, option, index): 
     size = super(ResizeDelegate, self).sizeHint(option, index) 
     if index.column() == self.stretch_column: 
      total_width = self.table.viewport().size().width() 
      calc_width = size.width() 
      for i in range(self.table.columnCount()): 
       if i != index.column(): 
        option_ = QtGui.QStyleOptionViewItem() 
        index_ = self.table.model().index(index.row(), i) 
        self.initStyleOption(option_, index_) 
        size_ = self.sizeHint(option_, index_) 
        calc_width += size_.width() 
      if calc_width < total_width: 
       size.setWidth(size.width() + total_width - calc_width) 
     return size 

... 

table = QTableWidget() 
delegate = ResizeDelegate(table, 0) 
table.setItemDelegate(delegate) 
... # Add items to table 
table.resizeColumnsToContents() 

Bạn có thể thiết lập các chế độ thay đổi kích thước để ResizeToContents, hoặc nếu bạn muốn người dùng để có thể điều chỉnh độ rộng cột, nếu cần, chỉ cần gọi resizeColumnsToContents bằng tay sau khi thực hiện thay đổi đối với các mặt hàng bảng.

Bạn cũng có thể cần phải fudge xung quanh với các tính toán chiều rộng một chút vì lề và đệm giữa các cột (như thêm một điểm ảnh hoặc hai đến calculated_width cho mỗi cột để tính toán cho biên giới ô).

+0

Điều này là tốt bởi vì bây giờ các cột của tôi không thay đổi kích thước bất cứ lúc nào như trước đây, nhưng chúng vẫn không chiếm hết dung lượng trống và thay đổi cột "stretch" dường như không có hiệu ứng ... Tôi có làm gì sai? Tôi sẽ chỉnh sửa câu hỏi của mình với kết quả tôi nhận được – BusyAnt

2

PyQt4

header = self.table.horizontalHeader() 
header.setResizeMode(0, QtGui.QHeaderView.Stretch) 
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(3, QtGui.QHeaderView.Stretch) 

PyQt5

header = self.table.horizontalHeader()  
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) 
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch) 
Các vấn đề liên quan