Проблема с расширением QScrollArea
Суть в следующем, в форме есть QScrollArea, внутри которой есть QWidget. В этот виджет я добавляю динамические фреймы, заполненные некой информацией о контактном лице - ФИО, номер телефона, email, описание. Выглядит это всё примерно так(снизу):
Всё выглядит вполне адекватно, однако стоит любое из полей сделать достаточно длинным - допустим, ФИО + описание - так сразу размер 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 шт):
Попробуйте заменить QLabel на QLineEdit в котором установите (в QtCreator в таблице свойств объекта):
- readOnly - установить галочку
- frame - снять галочку
- background-color: rgba(0, 0, 0, 0); Прозрачный фон
В таком виде QLineEdit не будет отличаться от QLabel, но любой, вылезающий за края текст, будет обрезаться.
Кроме того, если вы "укладываете" виджеты подряд, друг за другом, то рекомендую использовать layoutStretch (в таблице свойств лейаута). Например, если у вас 2 виджета в лейауте, то вы можете задать им весовые коэффициенты заполнения пространства (важно именно соотношение), например, таким образом 1,3, что означает второй будет больше в 3 раза, чем первый, 5,2 - первый относится ко второму как 5 к 2-м и так далее





