我正在尝试查找设置或大小策略,以便我的QToolBox
实例中的每个页面仅占用其内容所需的空间.我已经尝试了我在实例和每个页面的属性中看到的所有内容.
我是否误解了QToolBox
widget 的功能或者错过了正确的设置?
我想要的是与Qt Creator中的手风琴折叠型小部件类似的东西:
我似乎无法让这个"排序"页面只占用显示按钮和字段所需的大小.
不幸的是,你不能直接这样做,因为它将跨越标题小部件不占用的所有可用空间.你可以模仿你通过设置想要什么固定的高度上QToolBox
,如果你知道确切高度的网页.但你不希望这样做,在实践中.
如果您想要您要求的行为,那么您需要编写自己的自定义控件.它不一定很难.使用a QVBoxLayout
并填充自定义类的项目,让我们调用它ToolItem
,这是一个QWidget
带有标题(可能是一个显示/隐藏的按钮)和另一个QWidget
用于显示可见或不可见的内容.
以下非常简单的示例将切换ToolItem
单击时的可见性.只有在可见时它才会占据任何空间.
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;
};
Run Code Online (Sandbox Code Playgroud)
简单的用法:
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();
Run Code Online (Sandbox Code Playgroud)
你现在可以调整它看起来像是QToolBox
需要的.
请不要犹豫,提出后续问题.
归档时间: |
|
查看次数: |
6858 次 |
最近记录: |