2010-08-08 25 views
27

Tôi không chắc chắn làm thế nào để yêu cầu điều này, vì vậy, cảm thấy tự do để yêu cầu thêm thông tin.Làm thế nào để đảm bảo các cột trong QTableView được thay đổi kích thước thành tối đa

Dường như tableView->resizeColumnsToContents() sẽ chỉ thay đổi kích thước tất cả các cột dựa trên dữ liệu trong chế độ xem hiện tại. Điều đó có nghĩa là nếu tôi có nhiều dữ liệu bên dưới (dài hơn về số lượng từ), những từ đó sẽ được bao bọc (nếu thuộc tính wordWrap được đặt thành true).

Điều kỳ lạ là, nếu tôi cuộn xuống dưới cùng và làm mới dữ liệu, tableView sẽ thay đổi kích thước các cột đó một cách chính xác. Dường như là tableView không biết có văn bản dài hơn bên dưới.

Vì vậy, câu hỏi của tôi là, làm cách nào để đảm bảo rằng các cột đó được thay đổi kích thước thành giá thầu tối đa dựa trên tất cả dữ liệu?

mã My

QSqlTableModel *model = new QSqlTableModel; 
model->setTable("item"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->select();  
tableResult->setModel(model);  
tableResult->setEditTriggers(QAbstractItemView::NoEditTriggers);  
tableResult->setSelectionBehavior(QAbstractItemView::SelectRows); 
tableResult->setSelectionMode(QAbstractItemView::SingleSelection);  
tableResult->resizeColumnsToContents(); 
tableResult->resizeRowsToContents(); 

Cập nhật 1

Tôi đã thử tableResult->scrollToBottom() và nó sẽ chỉ chỉnh kích cỡ dựa trên mục ở phía dưới. Vì vậy, nếu có những từ dài hơn ở giữa, những từ đó sẽ được bao bọc.

Cập nhật 2

Nếu bất cứ ai muốn hiểu những gì tôi đang nói về, chỉ cần download ví dụ này. Bạn sẽ thấy rằng việc nhấn vào nút PushButton sẽ tạo ra một dữ liệu không được thay đổi kích cỡ một cách chính xác.

Cập nhật 3

Có thể là một lỗi: https://bugreports.qt.io/browse/QTBUG-9352

+0

Tôi đang gặp sự cố này. chỉ các hàng có thể thay đổi kích thước. Bạn đã bao giờ tìm thấy một sửa chữa cho điều này? – ComputerEngineer88

Trả lời

38

Tôi cố gắng tìm một cách giải quyết cho vấn đề này, bạn chỉ cần để ẩn bàn trước khi gọi resizeColumnsToContents().

Đối với một ví dụ:

tableResult->setVisible(false); 
tableResult->resizeColumnsToContents(); 
tableResult->setVisible(true); 
+1

+1 Beautifül!Sẽ không bao giờ nghĩ về điều đó ... –

+1

Kỳ lạ, 'table.resizeColumnsToContents()' hoạt động mà không ẩn/hiển thị bảng với PyQt5 – zdimension

+2

Trong Qt 5.6 cũng 'table.resizeColumnsToContents()' hoạt động mà không ẩn/hiển thị bảng – Indraraj

5

Tôi nghĩ rằng đó là bởi vì QSqlTableModel tải dữ liệu theo yêu cầu và quan điểm tính toán độ rộng cột chỉ dựa trên dữ liệu có sẵn. Nếu bạn không cần cột của bạn sẽ được sử dụng thay đổi kích thước, bạn có thể thử này:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); 
+0

Nó không hoạt động. Cột vẫn không thay đổi kích thước chính xác. Tôi đặt mã ở cuối hàm. Tôi cũng đã thử QList làm nguồn dữ liệu với mô hình QStandardItemModel. – amree

4

tôi đã sử dụng workaround giống như mô tả bởi amree, mà làm việc tuyệt vời cho các độ rộng cột, nhưng tableView->resizeRowsToContents() đã không làm việc một cách chính xác nếu có cột offscreen có tế bào multiline rằng nên có khiến chiều cao của một hàng tăng lên.

Tôi đã xem xét nguồn Qt và có vẻ như một số phép tính phụ thuộc vào hình dạng khung nhìn. Điều này dường như làm cho mọi thứ hoạt động chính xác cho cả hai cột và hàng:

#include <limits> 

tableView->setVisible(false); 
QRect vporig = tableView->viewport()->geometry(); 
QRect vpnew = vporig; 
vpnew.setWidth(std::numeric_limits<int>::max()); 
tableView->viewport()->setGeometry(vpnew); 
tableView->resizeColumnsToContents(); 
tableView->resizeRowsToContents(); 
tableView->viewport()->setGeometry(vporig); 
tableView.setVisible(true); 
+2

câu trả lời của amree đã giúp tôi, nhưng tôi gặp phải vấn đề với chiều cao tự động định cỡ hàng cùng một lúc và nghĩ rằng sẽ hữu ích cho độc giả tương lai đăng giải pháp của tôi cho vấn đề liên quan chặt chẽ đó. Hơn một chút so với "về cơ bản không có gì", tôi muốn nói. – dougg3

+0

Tuyệt vời, tôi đã cố gắng giải quyết vấn đề đó quá lâu! –

Các vấn đề liên quan