2013-09-02 31 views
6

Tôi đang cố gắng tìm chính sách cài đặt hoặc kích thước để mỗi trang trong trường hợp QToolBox của tôi chỉ chiếm dung lượng cần thiết cho nội dung của nó. Tôi đã thử mọi thứ tôi có thể thấy trong các thuộc tính cho cả cá thể và cho từng trang riêng lẻ.Với QToolBox, thiết lập nào để trang chỉ có kích thước nội dung của nó?

Tôi có hiểu sai về chức năng của tiện ích QToolBox hoặc chỉ thiếu cài đặt phù hợp không?

gì tôi sẽ là một cái gì đó tương tự như đàn accordion loại gấp widget trong Qt Creator:

enter image description here

tôi dường như không thể nhận được trang này "Sắp xếp" để có chỉ kích thước cần thiết để hiển thị nút và trường.

enter image description here

enter image description here

Trả lời

6

Đáng tiếc là bạn không thể làm điều đó trực tiếp vì nó sẽ kéo dài tất cả các không gian có sẵn mà các widget tiêu đề không chiếm. Bạn có thể mô phỏng những gì bạn muốn bằng cách đặt một fixed height trên QToolBox nếu bạn biết chính xác chiều cao (các) trang của mình. Nhưng bạn không muốn thực hiện điều đó trong thực tế.

Nếu bạn muốn hành vi bạn yêu cầu thì bạn cần phải viết kiểm soát tùy chỉnh của riêng mình. Nó không phải là khó khăn. Sử dụng một QVBoxLayout và điền vào các mục của một lớp tùy chỉnh, hãy gọi nó là ToolItem, là một tiêu đề QWidget với một tiêu đề (có thể là một nút để hiển thị/ẩn) và một số khác cho phép hiển thị nội dung có thể nhìn thấy được hay không.

Ví dụ rất đơn giản sẽ chuyển đổi chế độ hiển thị của ToolItem khi được nhấp. Và chỉ khi nhìn thấy nó sẽ chiếm bất kỳ không gian nào.

class ToolItem : public QWidget { 
public: 
    ToolItem(const QString &title, QWidget *item) : item(item) { 
    QVBoxLayout *layout = new QVBoxLayout; 
    layout->setContentsMargins(0, 0, 0, 0); 
    layout->addWidget(new QLabel(title)); 
    layout->addWidget(item);  
    setLayout(layout); 

    item->setVisible(false); 
    } 

protected: 
    void mousePressEvent(QMouseEvent *event) { 
    item->setVisible(!item->isVisible()); 
    } 

private: 
    QWidget *item; 
}; 

class ToolBox : public QWidget { 
public: 
    ToolBox() : layout(new QVBoxLayout) { 
    setLayout(layout); 
    } 

    void addItem(ToolItem *item) { 
    // Remove last spacer item if present. 
    int count = layout->count(); 
    if (count > 1) { 
     layout->removeItem(layout->itemAt(count - 1)); 
    } 

    // Add item and make sure it stretches the remaining space. 
    layout->addWidget(item);  
    layout->addStretch(); 
    } 

private: 
    QVBoxLayout *layout; 
}; 

Và đơn giản sử dụng của nó:

QWidget *window = new QWidget; 
window->setWindowTitle("QToolBox Example"); 

QListWidget *list = new QListWidget; 
list->addItem("One"); 
list->addItem("Two"); 
list->addItem("Three"); 

ToolBox *toolBox = new ToolBox; 
toolBox->addItem(new ToolItem("Title 1", new QLabel("Some text here"))); 
toolBox->addItem(new ToolItem("Title 2", list)); 
toolBox->addItem(new ToolItem("Title 3", new QLabel("Lorem Ipsum.."))); 

QVBoxLayout *layout = new QVBoxLayout; 
layout->addWidget(toolBox); 

window->setLayout(layout); 
window->resize(500, 500); 
window->show(); 

Bây giờ bạn có thể tinh chỉnh nó để trông giống như QToolBox nếu cần thiết.

Xin đừng ngần ngại hỏi các câu hỏi tiếp theo.

+0

Wow, ví dụ tuyệt vời; thực sự học được rất nhiều từ nó. Cảm ơn! Tôi mới đến Qt và bố trí đã được khó khăn nhất để có được một cảm giác trực quan. Bạn đã đặt ra các mối quan hệ ở đây theo cách cuối cùng nhấp cho tôi. Cuối cùng, tôi khá là một người chơi trò chơi với C++. Bạn đang chỉ sử dụng các tệp .h ở đây (ít nhất tôi đã làm để làm việc này). Tôi đã luôn luôn sử dụng .cpp + .h với nhau. Có một cái tên để chỉ sử dụng .h vì vậy tôi có thể tìm nó? Tôi thấy một cái gì đó gọi là "thành ngữ pimpl" nhưng tôi không chắc chắn nếu đó là những gì này được. –

+0

Bạn rất hoan nghênh. :) Vâng tôi chỉ cần đặt nó như thế này càng rõ ràng càng tốt. Bạn có thể có mọi thứ trong tệp .h nhưng sau đó về cơ bản nó chỉ trở thành tệp triển khai. Nó là tốt hơn để có các tập tin .h (với bao gồm bảo vệ) mà bạn có thể phơi bày giao diện với và sau đó.cpp tập tin với việc thực hiện thực tế. Trong một số trường hợp, bạn sẽ có một số triển khai trong tệp .h dù sao, như khi sử dụng mẫu. PIMPL vẫn sử dụng các tệp .h/.cpp. –

3

Ví dụ được hiển thị từ Nhà thiết kế Qt có thể không sử dụng QToolBox, hoạt động giống như tiện ích tab xếp chồng lên nhau chỉ hiển thị từng trang một. Ví dụ trong Qt Designer có vẻ là QTreeWidget với bản vẽ hoặc kiểu tùy chỉnh.

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