2013-01-18 18 views
5

Có thể có một số QSplitter có một tiện ích con có kích thước cố định và một phụ tùng khác có kích thước biến không?QSplitter với một tiện ích kích thước cố định và một tiện ích kích thước biến?

Mã này đặt ra những điều đúng, nhưng khi cửa sổ được thay đổi kích cỡ những thay đổi splitter tương ứng với các kích thước widget ban đầu:

vSplitter = new QSplitter(Qt::Vertical, this); 
vSplitter->addWidget(widget1); 
vSplitter->addWidget(widget2); 
QList<int> heights; 
heights.push_back(550); 
heights.push_back(1000); 
vSplitter->setSizes(heights); 

setCentralWidget(vSplitter); 

Cảm ơn bạn.

Trả lời

12

Hãy thử điều này một:

QSplitter::setStretchFactor (int index, int stretch)

Chỉ cần đặt yếu tố căng của phần bạn muốn duy trì kích thước cố định là 0 và đặt nó vào 1 trên widget khác.

Khi thay đổi kích thước toàn bộ cửa sổ, tiện ích có hệ số giãn 0 sẽ không thay đổi kích thước.

0

Tôi đang cố gắng làm một việc tương tự. Tôi có một tiện ích cố định (trên cùng) và một tiện ích không cố định (dưới cùng). Tôi muốn người dùng có thể sử dụng trình xử lý thông thường, nhưng tôi không muốn thay đổi kích thước cửa sổ để thêm khoảng trống vào tiện ích cố định. Sử dụng setSizePolicy trên cả hai widget không làm việc cho tôi, và cũng không sử dụng setStretchFactor trên một hoặc cả hai widget.

Tôi đã kết thúc phân lớp QSplitter để tôi có thể triển khai một resizeEvent có thể di chuyển bộ tách sau khi bộ chia kích thước được thay đổi kích thước. Mã này giả định: Chỉ có hai tiện ích con. Phần trên cùng [0] có thể thay đổi được và không được đặt ở phía dưới [1].

Đây là resizeEvent mà tôi đã viết:

MySplitter::resizeEvent(QResizeEvent *event) { 
    /* The first resizeEvent is -1 for height and width, because it was 
     invisible before. */ 
    if (event->oldSize().height() != -1) { 
     int diff; 
     QList<int> previousSizes = sizes(); 
     QSplitter::resizeEvent(event); 
     QList<int> newSizes = sizes(); 
     /* The bottom widget is the fixed one, so find out if that is to 
      grow or shrink. */ 
     diff = newSizes[1] - previousSizes[1]; 
     if (diff > 0) { 
      /* Keep the bottom from growing by giving the size to the top. */ 
      newSizes[0] += diff; 
      newSizes[1] -= diff; 
     } 
     else { 
      /* Steal size from the top to keep it from shrinking. */ 
      newSizes[0] -= diff; 
      newSizes[1] += diff; 
     } 
     setSizes(newSizes); 
    } 
    else 
     QSplitter::resizeEvent(event); 
}