我正在尝试查找设置或大小策略,以便QToolBox
实例中的每个页面只占用其内容所需的空间。我已经尝试了我在实例和每个页面的属性中看到的所有内容。
我是否误解了QToolBox
小部件的功能或者错过了正确的设置?
我想要的是类似于Qt Creator中的手风琴折叠式小部件:
我似乎无法将此“排序”页面仅显示为显示按钮和字段所需的大小。
答案 0 :(得分:8)
不幸的是,你不能直接这样做,因为它将跨越标题小部件不占用的所有可用空间。如果您知道页面的确切高度,可以在QToolBox
上设置fixed height来模拟您想要的内容。但是你不希望在实践中这样做。
如果您想要您所要求的行为,那么您需要编写自己的自定义控件。它不一定很难。使用QVBoxLayout
并填写自定义类的项目,让我们称之为ToolItem
,这是一个带有标题的QWidget
(可能是一个显示/隐藏的按钮)和另一个{{ 1}}用于显示可见或不可见的内容。
以下非常简单的示例将在点击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;
};
简单使用它:
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();
如果需要,您现在可以将其调整为QToolBox
。
请不要犹豫,提出后续问题。
答案 1 :(得分:3)
Qt Designer中显示的示例可能没有使用QToolBox
,其行为更像是一次只显示单个页面的堆叠标签窗口小部件。 Qt Designer中的示例似乎是带有自定义绘图或样式的QTreeWidget
。
答案 2 :(得分:0)
这不是完整的答案。
我找到了实际的组件,可以将其包含在外部设计师(的种类)中。这是一个显示如何执行此操作的最小示例(从https://github.com/zdenekzc/qtdesigner-integration修改)。
form.h
#ifndef FORM_H
#define FORM_H
#include <QMainWindow>
class FormWindow : public QMainWindow {
Q_OBJECT
public:
explicit FormWindow (QWidget * parent = 0);
};
#endif // FORM_H
form.cc
#include "form.h"
#include <QApplication>
#include <QtDesigner/QtDesigner>
#include <QtDesigner/QDesignerComponents>
FormWindow::FormWindow (QWidget* parent) : QMainWindow (parent) {
QDesignerFormEditorInterface* core = QDesignerComponents::createFormEditor (this);
core->setWidgetBox (QDesignerComponents::createWidgetBox (core, 0));
this->setCentralWidget (core->widgetBox());
}
extern "C" int main (int argc, char * * argv) {
QApplication app (argc, argv);
FormWindow * win = new FormWindow ();
win->show ();
return app.exec();
}
qt-designer.pro
QT += designer
HEADERS = form.h
SOURCES = form.cc
LIBS += -lQt5DesignerComponents
构建它:
mkdir -p build
cd build
qmake-qt5 ../qt5-design.pro
make
./qt5-design
除非您想建立一个设计器,否则这本身并没有什么用处,而是朝着隔离实际组件迈出了一步。