7

我正在尝试查找设置或大小策略,以便我QToolBox实例中的每个页面只占用其内容所需的空间。我已经尝试了实例和每个单独页面的属性中可以看到的所有内容。

我是否误解了QToolBox小部件的功能或只是缺少正确的设置?

我想要的是类似于 Qt Creator 中的手风琴折叠类型小部件:

在此处输入图像描述

我似乎无法让这个“排序”页面只占用显示按钮和字段所需的大小。

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

8

不幸的是,您不能直接这样做,因为它将跨越标题小部件不占用的所有可用空间。如果您知道页面的确切高度,则可以通过设置固定高度来模拟您想要的内容。QToolBox但你不想在实践中这样做。

如果您想要您要求的行为,那么您需要编写自己的自定义控件。这不一定很难。使用 aQVBoxLayout并填写自定义类的项目,我们称之为它ToolItem,它是QWidget带有标题(可能是显示/隐藏按钮)的 a,另一个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

请不要犹豫,提出后续问题。

于 2013-09-02T22:02:42.910 回答
4

Qt Designer 中显示的示例可能没有使用QToolBox,它的行为更像是一个堆叠的选项卡小部件,一次只显示一个页面。Qt Designer 中的示例似乎是QTreeWidget带有自定义绘图或样式的。

于 2013-09-04T15:01:27.907 回答
0

这不是完整的答案。

我追踪了实际的组件,它可以包含在设计师之外(有点)。这是一个显示如何执行此操作的最小示例(从https://github.com/zdenekzc/qtdesigner-integration修改)。

在此处输入图像描述

表格.h

#ifndef FORM_H
#define FORM_H

#include <QMainWindow>

class FormWindow : public QMainWindow {
   Q_OBJECT

   public:
       explicit FormWindow (QWidget * parent = 0);
};

#endif // FORM_H

表格.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

除非您想构建一个设计器,否则这本身显然没有用,而是朝着隔离实际组件迈出了一步。

于 2020-06-09T22:27:50.017 回答