2009-10-20 34 views
5

Tôi muốn có thể ngăn người dùng di chuyển QSplitter khi đang chạy. Gọi điện thoại setEnabled(false) thực hiện điều này, nhưng nó cũng vô hiệu hóa tất cả các tiện ích con - đó không phải là những gì tôi muốn. Có cách nào để đạt được điều này? Tôi có phải vô hiệu hóa bộ chia, và sau đó kích hoạt lại tất cả các widget con bằng tay? Điều đó có vẻ khá cồng kềnh, đối với một cái gì đó mà phải là một thực hành hợp lý phổ biến.Tắt bộ chia Qt

Có ai có thể đề xuất bất cứ điều gì không?

Trả lời

1

Thực ra, tôi chưa bao giờ thấy bất kỳ ai từng vô hiệu hóa trình chia tách: Chúng ở đó để người dùng có thể bố trí giao diện người dùng theo nhu cầu của mình, vậy tại sao mọi người lại muốn tắt tính năng này? Hoặc bạn cần một bộ chia hoặc bạn có thể sử dụng một trong các bố cục thông thường (mà người dùng không thể thay đổi kích thước).

Nếu bạn vẫn muốn thử, tôi nghĩ bạn nên xem closestLegalPosition() hoặc getRange(). Nếu bạn chỉ cần trả lại chiều rộng của tiện ích thì việc thay đổi kích thước sẽ ngừng hoạt động.

+1

Tôi đoán rằng sẽ là cách dễ nhất - các trường hợp sử dụng là: I Have a ui, có thể được đưa vào một chế độ nhất định, trong đó một trong những đứa trẻ của splitter vật dụng biến mất. Trong trường hợp đó, tôi không muốn người dùng có thể di chuyển bộ chia, vì chỉ có một tiện ích ở một bên - điều đó có hợp lý không? – Thomi

+0

Tỷ lệ cược. Tôi đoán rằng bộ chia sẽ không cung cấp một yếu tố kéo khi nó chỉ có một đứa trẻ. Bạn có thể kiểm tra xem thực sự chỉ có một đứa trẻ không? –

+0

Vâng, bạn thực sự không thể xóa một tiện ích khỏi bộ tách - API công cộng QSplitter không cung cấp phương thức để thực hiện việc này. Điều tốt nhất bạn có thể đạt được là giấu bọn trẻ. Bất kỳ ý tưởng? – Thomi

0

Bạn phải làm hai việc. Đặt các tiện ích (không được đặt lại) bên trong bộ chia thành FixedSize và thay đổi con trỏ của bộ chia phóng viên xử lý thành Qt::ArrowCursor. Cụm tay lái bắt đầu với zero (trái và không được sử dụng), do đó xử lý đầu tiên giữa hai widget là bởi chỉ số 1.

Đây là một mẫu (đặt mã trong main.cpp):

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget window; 
    window.resize(800, 300); 
    window.setWindowTitle("Splitter Test"); 
    window.show(); 

    QSplitter *splitter = new QSplitter(&window); 
    QListView *listview = new QListView; 
    QTreeView *treeview = new QTreeView; 
    QTextEdit *textedit = new QTextEdit; 

    splitter->addWidget(listview); 
    splitter->addWidget(treeview); 
    splitter->addWidget(textedit); 
    splitter->setChildrenCollapsible(false); 

    splitter->show(); 
    listview->show(); 
    treeview->show(); 
    textedit->show(); 

    //make the lisview 'fix' 
    listview->setFixedSize(listview->width(), listview->height()); 
    //change the cursor over the splitter handle between listview and 
    //treeview to ArrowCursor 
    splitter->handle(1)->setCursor(Qt::ArrowCursor);; 

    return app.exec(); 
} 

Bây giờ đầu tiên splitter xử lý là disabled và thứ hai hoạt động.

10

Làm điều này:

for (int i = 0; i < splitter->count(); i++) 
{ 
    QSplitterHandle *hndl = splitter->handle(i); 
    hndl->setEnabled(false); 
} 
Các vấn đề liên quan