Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145

Масштабирование frame и текста внутри

18.05.2022, 23:44. Показов 2436. Ответов 21
Метки c++, qt (Все метки)

Студворк — интернет-сервис помощи студентам
У каждой компании есть заметки, заметки хранятся в БД, в виде таблицы с двумя полями - id компании и собственно сам текст заметки. Нажимаешь на нужную компанию, её заметки подгружаются и выводятся в виде динамически созданных фреймов с кнопкой удаления и самим текстом. Вот код самого обновления:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
dynamicFrame *frame = new dynamicFrame(this);
        frame->setStyleSheet("background-color:rgb(47,49,54);"
                             "color:white;"
                             "border-width:1px;"
                             "border-radius:8px;"
                             "border-color: black;");
        frame->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
        QHBoxLayout *lay = new QHBoxLayout(frame);
 
        dynamicText *text = new dynamicText(frame);
        text->setReadOnly(true);
        text->setTextInteractionFlags(Qt::NoTextInteraction);
        text->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
        text->setFont(defaultfont);
 
        dynamicLabel *date = new dynamicLabel(frame);
        date->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
        date->setFont(defaultfont);
 
        dynamicButton *button = new dynamicButton(frame);
        button->setID(query.value(rec.indexOf("id")).toString());
        button->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
        button->setFixedSize(24,24);
        button->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->setText("X");
        connect(button, SIGNAL(clicked()), this, SLOT(deleteDynamicButton_deleteNote()));
 
        text->setText(query.value(rec.indexOf("text")).toString());
        date->setText(query.value(rec.indexOf("date")).toString());
        QString s = text->toPlainText();
        QFontMetrics fm(text->font());
        int pixelsWide = fm.horizontalAdvance(s); //ширина текста
        int rowCount = pixelsWide/200; //кол-во строк
        if (rowCount == 0){ //если 0 - фиксированные 30
            text->setFixedHeight(30);
        } else{ //если больше 0 = формула
            int height = rowCount * 22 + 8;
            text->setFixedHeight(height);
        }
        text->setStyleSheet("background-color: transparent");
        text->setStyleSheet("border:0px solid black");
        lay->addWidget(text);
        lay->addWidget(date);
        lay->addWidget(button);
        ui->verticalLayout_11->addWidget(frame);
    }
Вот так это выглядит:


Если вы обратили внимание, в коде обновления есть некая "формула", которая являлась временным решением, она подстраивала размер фрейма под размер текста. (результат видно на скрине выше, что занималась она этим, грубо говоря, некорректно). Мне нужно каким-то образом, при обновлении сразу выставлять фрейму идеальный размер. В коде используется шрифт "defaultFont", вот он:
C++ (Qt)
1
QFont defaultfont = QFont("Segoe UI",12,2);
Плюсом ко всему, мне нужно менять размер этого фрейма при масштабировании самого окна, чтобы не было такого:


Какими средствами можно подобную штуку реализовать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2022, 23:44
Ответы с готовыми решениями:

Масштабирование текста внутри button
Как можно масштабировать текст внутри button, при изменении размеров самой кнопки? только без textblock. Хочу через binding, но к чему...

картинка типа frame, c внутри картинкой
как сделать такую вещь правильней было? при наведении картинка фрайма меняется. картинку фрайма я бакграундом ставлю блоку, внутри...

Как обработать Label-ы внутри Frame-ов?
Имеем Frame1 и Frame2, в каждом из которых находится массив Label1. Frame1 имеет Label1(0) Frame2 имеет Label1(1). При...

21
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
23.05.2022, 11:46
Студворк — интернет-сервис помощи студентам
PrOsTo_NiK_, красота!
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.05.2022, 12:09
Цитата Сообщение от PrOsTo_NiK_ Посмотреть сообщение
ограниченность всё же видна в некоторых моментах
На то они и виджеты. Их можно стилями подкрасить, но сделать что то глобально будет проблематично. Вот вам еще характерный пример, две таблицы, обе без украшений. Та что на QML уже по умолчанию выглядит куда как приятнее. Естественно, там приходится менять подход к работе, все таки многие вещи, привычные в виджетах там неприменимы, но это только дело времени и навыков. Зато поняв принцип, вы можете менять интерфейс в очень широких пределах, вплоть, как я уже говорил, до использования 3D в вашем 2D отображении.
Миниатюры
Масштабирование frame и текста внутри   Масштабирование frame и текста внутри  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2022, 12:09
Помогаю со студенческими работами здесь

Не растягивается grid внутри canvas frame
class Brend_table(): ''' Класс работы с таблицей отображения на форме с данными ..... ''' def...

Изменить стиль внутри frame через определенное время
Добрый день, делаю для своей школы онлайн расписание. Просто в коридоре в школе будет висеть плазма на которой будет открыт мой сайт. На...

Масштабирование изображения внутри ячейки таблицы
Приветствую. Долгое гугление не принесло толком никаких результатов, так что надеюсь получить здесь ответ. Имеется таблица с одной...

Настройка плиточного интерфейса. Масштабирование изображения внутри плитки
Вопрос в следующем. Иконка Firefox прекрасно растянулась на средний размер плитки. В то время, как иконки моего компьютера, параметров и...

Контекстное меню и вывод текста на рамку (frame)
Имеется 6 рамок (frame) и необходимо чтобы при нажатии правой кнопкой мыши на любое место в пределах соответствующей рамки, открывалось...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru