2012-01-24 34 views
5

Tôi là một lập trình viên sinh viên và tôi đang sử dụng Qt để xây dựng giao diện GUI cho công việc. Tôi có một QTreeWidget có tổng cộng 8 Cột. Đầu vào cần phải được nhập vào mỗi một trong các cột này là khá nhỏ. Về vấn đề đó, tôi đã cố gắng tìm cách để kích thước lại tất cả các cột với số lượng không gian ít nhất cần thiết. giống như hành động được thực hiện khi bạn nhấp vào các ngăn. Tôi đã xem qua một số trang web và các tài liệu Qt và đã không tìm thấy một giải pháp. Sau khi xem qua các tài liệu có vẻ như có một loạt các cách để làm điều này nhưng tôi không thể có được một để làm việc. Tôi bắt đầu nghĩ rằng tôi cần phải kích hoạt/vô hiệu hóa một cái gì đó ở đâu đó. Nó giống như những thay đổi mà tôi viết vào hàm xây dựng của tôi (Hàm này xóa bảng; Đọc dữ liệu từ vectơ của tôi, hiển thị dữ liệu nhất định trong bảng, và giả sử kích thước lại các tiêu đề/cột thành kích thước vừa đủ để vừa với nội dung của cột) thậm chí không được áp dụng. Tôi đã thử những điều sau đây không có thay đổi:Cách thay đổi kích thước các cột trong QTreeWidget thành không gian tối thiểu cần thiết

 ui->treeWidgetInjections->setColumnWidth(i, minimumWidth()); 
     ui->treeWidgetInjections->resizeColumnToContents(i); 
     ui->treeWidgetInjections->header()->ResizeToContents; 
     ui->treeWidgetInjections->header()->resizeSection(i, minimumWidth()); 

Tất cả trong số này là vào cuối hợp đồng xây dựng Chức năng của tôi (thông tin không liên quan bị loại bỏ):

ui->treeWidgetInjections->clear(); 
    for (int i=0; i < qTreeInjectionData.size(); i++) 
     { 
      //fill Qtree with items; 
      //fill QTree items with data; 
      //re size function here; 
     } 

Xin vui lòng chỉ để lại phản hồi hiệu quả như tôi chỉ là quan tâm đến việc học và vượt qua thử thách này. Cảm ơn trước!

+0

Tôi nghĩ rằng tôi cho vòng lặp là vấn đề ở đây; đặc biệt tôi nghĩ rằng. kích thước có thể đã chịu trách nhiệm cho vấn đề này. –

Trả lời

14

dụ tối thiểu này làm việc cho tôi:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QVBoxLayout *layout = new QVBoxLayout(centralWidget()); 
    QTreeWidget *tree = new QTreeWidget(this); 
    layout->addWidget(tree); 

    tree->setColumnCount(3); 

    QStringList first, second, third; 
    first << "xxxxxxxxx"  << "xxxxxxxxxxxxx"  << "xxxxxxxx"; 
    second << "xxxxx"   << "xxxxxxxxxxxxxxxxx" << "xxxxx"; 
    third << "xxxxxxxxxxxxxx" << "xxxxxxxxxx"  << "xxxxxxxx"; 

    tree->insertTopLevelItem(0, new QTreeWidgetItem(first)); 
    tree->insertTopLevelItem(0, new QTreeWidgetItem(second)); 
    tree->insertTopLevelItem(0, new QTreeWidgetItem(third)); 

    for(int i = 0; i < 3; i++) 
     tree->resizeColumnToContents(i); 
} 

Tất cả bạn cần làm là gọi phương thức resizeColumnToContents() một lần cho mỗi cột sau khi bạn cư xem. Hãy cho tôi biết nếu sự cố vẫn tiếp diễn.

+0

Nó thực sự kỳ lạ nhưng khi tôi tạo ra một vòng lặp riêng biệt trong chức năng xây dựng của tôi cho cột lại kích thước của nó nó làm việc tốt ... rất lạ. CẢM ƠN BẠN ĐÃ GIÚP ĐỠ! Ví dụ của bạn đã giúp tôi một cách lớn và tôi chắc chắn điều này sẽ giúp ích cho người khác! –

+1

Thật không may, phương pháp này chỉ thay đổi kích thước theo nội dung của tiêu đề cho tôi. Dữ liệu được hiển thị từ được bọc. –

2

Vấn đề đối với tôi là StretchLastSection được đặt thành true và nếu giá trị này được đặt thành true, thuộc tính này sẽ ghi đè chế độ thay đổi kích thước được đặt trên phần cuối cùng trong tiêu đề.

Giải pháp:

_treeWidget = new UIWidgetSceneTree(); 
_treeWidget->header()->setStretchLastSection(false); 
_treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents); 
Các vấn đề liên quan