Проблема с расширением QScrollArea

Суть в следующем, в форме есть QScrollArea, внутри которой есть QWidget. В этот виджет я добавляю динамические фреймы, заполненные некой информацией о контактном лице - ФИО, номер телефона, email, описание. Выглядит это всё примерно так(снизу):

enter image description here

Всё выглядит вполне адекватно, однако стоит любое из полей сделать достаточно длинным - допустим, ФИО + описание - так сразу размер QLabel расширяется, переходя все границы

введите сюда описание изображения

Но это ладно, ерунда начинается там, когда размер и ФИО и описания довольно длинные - там всё вовсе ломается. Размер QLabel Не ограничивается размерами, выделенными им в Widget'е, они расширяют всю ScrollArea, пряча весь не уместившийся текст:

введите сюда описание изображения

Я уже устал комбинировать разные сочетания SizePolicy, как мне ограничить размер либо всей ScrollArea, чтобы она не выходила за рамки, либо же размер самого QLabel, чтобы в случае, если текст в этом лейбле длиннее места, выделенного этому лейблу - он не расширялся, а просто прятал текст.

UPD. Можно добиться "ПРИМЕРНО" нужного мне поведения, если включить эту галочку (опять же, пришел к этому методом тыка) :

введите сюда описание изображения

Вот такой результат после этого действия:

введите сюда описание изображения

Однако, тогда и вся ScrollArea перестает расширяться,

введите сюда описание изображения

что тоже не является грамотным решением. В общем, выручайте, люди, что нужно сделать, дабы подобрать нужные мне настройки фрейма/виджета/QScrollArea, чтобы текст не вылезал за рамки размера QLabel, обозначенные не текстом внутри, а именно окружающими его факторами.

Вот код самого "обновления" фреймов в зависимости от содержания QList

void MainWindow::UpdateNewClientPhones(){
ClearNewClientPhones();
bool mainIsThere = false, notMainIsThere = false;
for(int i = 0; i < NewClientPhones.size(); i+=5){
    
    dynamicFrame *frame = new dynamicFrame(this);
    frame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    frame->setStyleSheet("background-color:rgb(47,49,54);"
                         "color:white;"
                         "border-width:1px;"
                         "border-radius:8px;"
                         "border-color: black;");
    QHBoxLayout *lay = new QHBoxLayout(frame);
    QHBoxLayout *hLay_1 = new QHBoxLayout();
    QHBoxLayout *hLay_2 = new QHBoxLayout();
    QHBoxLayout *hLay_3 = new QHBoxLayout();
    QHBoxLayout *hLay_4 = new QHBoxLayout();
    QHBoxLayout *upperH = new QHBoxLayout();
    QHBoxLayout *downH = new QHBoxLayout();
    QVBoxLayout *vLay = new QVBoxLayout();


    dynamicLabel *icon_fullName = new dynamicLabel(frame);
    icon_fullName->setFixedSize(24,24);
    QPixmap pix_fullName(":/images/images/administrator-24.png");
    icon_fullName->setPixmap(pix_fullName);
    dynamicLabel *fullName = new dynamicLabel(frame);
    fullName->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
    fullName->setFont(defaultfont);
    if(NewClientPhones[i+1] != ""){
        fullName->setText(NewClientPhones[i+1]);
        fullName->setToolTip(NewClientPhones[i+1]);
    } else {
        fullName->setText("—");
        fullName->setToolTip("Не указано");
    }
    fullName->setTextInteractionFlags(Qt::TextSelectableByMouse);
    hLay_1->addWidget(icon_fullName); hLay_1->addWidget(fullName);

    dynamicLabel *icon_info = new dynamicLabel(frame);
    icon_info->setFixedSize(24,24);
    QPixmap pix_info(":/images/images/about-24.png");
    icon_info->setPixmap(pix_info);
    dynamicLabel *information = new dynamicLabel(frame);
    information->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
    information->setFont(defaultfont);
    if(NewClientPhones[i+2] != ""){
        information->setText(NewClientPhones[i+2]);
        information->setToolTip(NewClientPhones[i+2]);
    } else {
        information->setText("—");
        information->setToolTip("Не указано");
    }
    information->setTextInteractionFlags(Qt::TextSelectableByMouse);
    hLay_2->addWidget(icon_info); hLay_2->addWidget(information);

    upperH->addLayout(hLay_1); upperH->addLayout(hLay_2);
    //fullName->setMinimumWidth(104);
    //QSpacerItem *spacer = new QSpacerItem(80, 20, QSizePolicy::Fixed, QSizePolicy::Minimum);

    dynamicLabel *icon_phone = new dynamicLabel(frame);
    icon_phone->setFixedSize(24,24);
    QPixmap pix_phone(":/images/images/phone.png");
    icon_phone->setPixmap(pix_phone);
    dynamicLabel *phone = new dynamicLabel(frame);
    phone->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
    phone->setFont(defaultfont);
    if(NewClientPhones[i+3] != ""){
        phone->setText(NewClientPhones[i+3]);
        phone->setToolTip(NewClientPhones[i+3]);
    } else {
        phone->setText("—");
        phone->setToolTip("Не указано");
    }
    phone->setTextInteractionFlags(Qt::TextSelectableByMouse);
    hLay_3->addWidget(icon_phone); hLay_3->addWidget(phone);

    dynamicLabel *icon_email = new dynamicLabel(frame);
    icon_email->setFixedSize(24,24);
    QPixmap pix_email(":/images/images/email.png");
    icon_email->setPixmap(pix_email);
    dynamicLabel *email = new dynamicLabel(frame);
    email->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
    email->setFont(defaultfont);
    if(NewClientPhones[i+4] != ""){
        email->setText(NewClientPhones[i+4]);
        email->setToolTip(NewClientPhones[i+4]);
    } else {
        email->setText("—");
        email->setToolTip("Не указано");
    }
    email->setTextInteractionFlags(Qt::TextSelectableByMouse);
    hLay_4->addWidget(icon_email); hLay_4->addWidget(email);

    downH->addLayout(hLay_3); downH->addLayout(hLay_4);
    vLay->addLayout(upperH); vLay->addLayout(downH);

    dynamicButtonMainOrNotMainPhone *button_main = new dynamicButtonMainOrNotMainPhone(frame);
    button_main->setID(QString::number(i));
    button_main->setMainStatus(NewClientPhones[i]);
    button_main->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
    button_main->setFixedSize(60,24);
    if(NewClientPhones[i] == "1"){
        button_main->setStyleSheet("QPushButton{color:black;"
                                "border-style: solid;"
                                "border-width:1px;"
                                "border-radius:3px;"
                                "border-color: black;"
                                "max-width:60px;"
                                "max-height:24px;"
                                "min-width:60px;"
                                "min-height:24px;"
                                "color:black;"
                                "background-color:rgb(5, 255, 26);"
                                "}"

                                "QPushButton:hover{ color:black;"
                                "border-style: solid;"
                                "border-width:1px;"
                                "border-radius:3px;"
                                "border-color: black;"
                                "max-width:60px;"
                                "max-height:24px;"
                                "min-width:60px;"
                                "min-height:24px;"
                                "color:black;"
                                "background-color:rgb(5, 156, 16);"
                                "}");
    } else {
        button_main->setStyleSheet("QPushButton{color:black;"
                                "border-style: solid;"
                                "border-width:1px;"
                                "border-radius:3px;"
                                "border-color: black;"
                                "max-width:60px;"
                                "max-height:24px;"
                                "min-width:60px;"
                                "min-height:24px;"
                                "color:black;"
                                "background-color:rgb(255, 0 , 0);"
                                "}"

                                "QPushButton:hover{ color:black;"
                                "border-style: solid;"
                                "border-width:1px;"
                                "border-radius:3px;"
                                "border-color: black;"
                                "max-width:60px;"
                                "max-height:24px;"
                                "min-width:60px;"
                                "min-height:24px;"
                                "color:black;"
                                "background-color:rgb(145, 0, 0);"
                                "}");
    }
    button_main->setText("Основной");
    connect(button_main, SIGNAL(clicked()), this, SLOT(setMainOrNotMainPhone()));


    DynamicButton_Delete_clientPhone *button_x = new DynamicButton_Delete_clientPhone(frame);
    button_x->setID(QString::number(i));
    button_x->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
    button_x->setFixedSize(24,24);
    button_x->setStyleSheet("QPushButton{color:black;"
                            "border-style: solid;"
                            "border-width:1px;"
                            "border-radius:3px;"
                            "border-color: black;"
                            "max-width:24px;"
                            "max-height:24px;"
                            "min-width:24px;"
                            "min-height:24px;"
                            "color:black;"
                            "background-color:rgb(255, 0 , 0);"
                            "}"

                            "QPushButton:hover{ color:black;"
                            "border-style: solid;"
                            "border-width:1px;"
                            "border-radius:3px;"
                            "border-color: black;"
                            "max-width:24px;"
                            "max-height:24px;"
                            "min-width:24px;"
                            "min-height:24px;"
                            "color:black;"
                            "background-color:rgb(145, 0, 0);"
                            "}");
    button_x->setText("X");
    connect(button_x, SIGNAL(clicked()), this, SLOT(deleteDynamicButton_deleteClientsPhone()));
    lay->addLayout(vLay); lay->addWidget(button_main); lay->addWidget(button_x);
    frame->setLayout(lay);
    if(NewClientPhones[i] == "1"){
        if(mainIsThere == false){
            mainIsThere = true;
        }
        ui->verticalLayout_3->addWidget(frame);
    } else if(NewClientPhones[i] == "0"){
        if(notMainIsThere == false){
            notMainIsThere = true;
        }
        ui->verticalLayout_6->addWidget(frame);
    }
}
if(!mainIsThere){
    dynamicFrame *frame = new dynamicFrame(this);
    frame->setStyleSheet("background-color:rgb(47,49,54);"
                         "color:white;"
                         "border-width:1px;"
                         "border-radius:8px;"
                         "border-color: black;");
    QHBoxLayout *lay = new QHBoxLayout(frame);
    dynamicLabel *isClear = new dynamicLabel(frame);
    isClear->setText("Пусто");
    isClear->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
    isClear->setFont(defaultfont);
    lay->addStretch();
    lay->addWidget(isClear);
    lay->addStretch();
    frame->setLayout(lay);
    ui->verticalLayout_3->addWidget(frame);
}
if(!notMainIsThere){
    dynamicFrame *frame = new dynamicFrame(this);
    frame->setStyleSheet("background-color:rgb(47,49,54);"
                         "color:white;"
                         "border-width:1px;"
                         "border-radius:8px;"
                         "border-color: black;");
    QHBoxLayout *lay = new QHBoxLayout(frame);
    dynamicLabel *isClear = new dynamicLabel(frame);
    isClear->setText("Пусто");
    isClear->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
    isClear->setFont(defaultfont);
    lay->addStretch();
    lay->addWidget(isClear);
    lay->addStretch();
    frame->setLayout(lay);
    ui->verticalLayout_6->addWidget(frame);
}
}

Ответы (1 шт):

Автор решения: Alexander Chernin

Попробуйте заменить QLabel на QLineEdit в котором установите (в QtCreator в таблице свойств объекта):

  • readOnly - установить галочку
  • frame - снять галочку
  • background-color: rgba(0, 0, 0, 0); Прозрачный фон

В таком виде QLineEdit не будет отличаться от QLabel, но любой, вылезающий за края текст, будет обрезаться.

Кроме того, если вы "укладываете" виджеты подряд, друг за другом, то рекомендую использовать layoutStretch (в таблице свойств лейаута). Например, если у вас 2 виджета в лейауте, то вы можете задать им весовые коэффициенты заполнения пространства (важно именно соотношение), например, таким образом 1,3, что означает второй будет больше в 3 раза, чем первый, 5,2 - первый относится ко второму как 5 к 2-м и так далее

→ Ссылка