Con QToolBox, ¿qué configuración para que la página sea solo el tamaño de su contenido?

 C Programming >> Programación C >  >> Tags >> Qt
Con QToolBox, ¿qué configuración para que la página sea solo el tamaño de su contenido?

Lamentablemente, no puede hacerlo directamente porque abarcará todo el espacio disponible que no ocupan los widgets de título. Puedes emular lo que quieras estableciendo una altura fija en el QToolBox si conoce la altura exacta de su(s) página(s). Pero tú no quiero hacer eso en la práctica.

Si desea el comportamiento que solicita, debe escribir su propio control personalizado. No tiene que ser difícil. Usa un QVBoxLayout y complete los elementos de una clase personalizada, llamémoslo ToolItem , que es un QWidget con un título (quizás un botón para mostrar/ocultar) y otro QWidget para mostrar los contenidos que son visibles o no.

Lo siguiente muy sencillo ejemplo alternará la visibilidad del ToolItem cuando se hace clic. Y solo cuando sea visible ocupará algún espacio.

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;
};

Y el uso simple de la misma:

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();

Ahora puede modificarlo para que se parezca al QToolBox si es necesario.

No dude en hacer preguntas de seguimiento.


Es posible que el ejemplo que se muestra de Qt Designer no esté usando un QToolBox , que se comporta más como un widget de pestañas apiladas que solo muestra una página a la vez. El ejemplo en Qt Designer parece ser un QTreeWidget con dibujo o estilo personalizado.