Đá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.
Nguồn
2013-09-02 22:02:42
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. –
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. –