Qt виджет (с разметкой) пробел. Что это? Как убрать? - PullRequest
4 голосов
/ 03 февраля 2012

Я написал программу, которая использует виджеты в качестве контейнера (для других виджетов).Поскольку содержимое контейнера изменяется в течение всей жизни программы, виджет контейнера имеет связанный с ним макет, поэтому он правильно изменяет размер.Проблема в том, что контейнер, похоже, занимает некоторое место.

В следующей программе я воспроизвел проблему: у меня есть группа с несколькими метками, одна из которых включена в контейнер (виджетw - и его расположение t - включает метку "что это за дополнительное пространство?").Моя цель - сделать интервалы между всеми метками одинаковыми, независимо от того, находятся они в контейнерах или нет.(контейнер не должен занимать место)

Я также пытался раскрасить разные части виджетов.Где моя прокладка?Какое лишнее пространство между виджетами (между синим).И как мне это убрать?

 #include <QApplication>
 #include <QtCore>
 #include <QMainWindow>
 #include <QGroupBox>
 #include <QHBoxLayout>
 #include <QLabel>
 #include <QMdiArea>
 #include <QMdiSubWindow>

 #include <stdlib.h>

 QMdiArea* g1;
 QGroupBox* g1a;

 int main(int argc, char *argv[])
 {
    QApplication app(argc, argv);
    QMainWindow* main_window = new(QMainWindow);
    main_window->resize(200, 200);
    main_window->setWindowTitle("Hello");

    g1a = new QGroupBox("G1A", g1);
    QVBoxLayout *g1a_l = new QVBoxLayout(g1a);
    g1a_l->setSpacing(0);
    main_window->setCentralWidget(g1a);

    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label1"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label2"));
    QWidget* w=new QWidget(0);
    w->setStyleSheet( "border: 2 solid blue; padding: 2 solid yellow;" );
    QVBoxLayout* t=new QVBoxLayout(w);
    t->setSpacing(0);
    t->addWidget(new QLabel("What is that extra space??",w));

    g1a_l->addWidget(w);
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label3"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label4"));

    //sub_window->adjustSize();
    main_window->show(); //How to I get that to recaclulate the size of its contents?
    return app.exec();
 }

Ответы [ 3 ]

7 голосов
/ 03 февраля 2012

Это ContentMargin

Чтобы удалить его:

t->setContentsMargins(0,0,0,0);
2 голосов
/ 03 февраля 2012

Пространство, на которое вы ссылаетесь, является полем содержимого. Документ здесь описывает, как отрисовываются виджеты. Чтобы избавиться от этого лишнего места, вы должны позвонить:

widget->setContentsMargins(0, 0, 0, 0);

Я считаю, что конечный результат должен выглядеть следующим образом:

enter image description here

0 голосов
/ 03 февраля 2012

Метод управления интервалом, который я помню, заключается в добавлении выделенных элементов QSpacerItem между виджетами.

Но я сначала пытаюсь выяснить, что делает w. Почему бы не позвонить g1a_l->addLayout(t); напрямую?

...