46 / 22 / 6
Регистрация: 09.06.2017
Сообщений: 285
Записей в блоге: 18
1

Как установить предпочтительные размеры в QSplitter

02.03.2024, 12:35. Показов 739. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
, с которыми он бы стартовал?
setStretchFactor() работает непредсказуемо. Казалось бы - индекс виджета и удельный вес! Не, нифига.
setMinimumWidth() немного лучше. Фиксирует минимальную ширину. В сочетании с предыдущим даже может показаться, что норм, но нет. Если стретч "недотягивает" по ширине какой-то виджет, то он так и будет недотянут, а соседний - растянут (больше своего минимального). Можно задать стретч с перехлёстом, но всё равно: когда вручную растягиваешь - хорошо, когда сжимаешь - сначала застревает на минимальной ширине, а потом разом схлопывается в ноль, без промежуточных положений.
setSizePolicy() тоже не о том. Принимает QSizePolicy, у которой, в свою очередь, только enum типа Fixed, Minimum, Maximum, Preferred, Expanding, числовых значений нет.
Ещё есть совет про saveState и restoreState - ок, запомню, но это не то.

Для простоты - код:
Кликните здесь для просмотра всего текста
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
71
72
73
74
75
76
77
78
79
#include <QApplication>
#include <QStackedWidget>
#include <QWidget>
#include <QHBoxLayout>
#include <QToolBar>
#include <QAction>
#include <QPixmap>
#include <QIcon>
#include <QScreen>
#include <QObject>
#include <QSplitter>
#include <QRect>
#include <QTextEdit>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    const QRect aG = w.screen()->availableGeometry();
    w.resize((aG.width() * 4) / 5, (aG.height() * 4) / 5);
    w.move((aG.width() - w.width()) / 2, (aG.height() - w.height()) / 2);
 
    QHBoxLayout *hBoxFull = new QHBoxLayout;
 
    QToolBar *leftToolBar = new QToolBar;
    leftToolBar->setOrientation(Qt::Vertical);
    leftToolBar->setIconSize(QSize(40, 40));
 
    QPixmap searchpix("D:/code/Qt/test_QStackedWidget/search.png");
    QPixmap explorerpix("D:/code/Qt/test_QStackedWidget/explorer.png");
    QPixmap openFilepix("D:/code/Qt/test_QStackedWidget/openFile.png");
    QPixmap createFilepix("D:/code/Qt/test_QStackedWidget/createFile.png");
    QPixmap saveFilepix("D:/code/Qt/test_QStackedWidget/saveFile.png");
    QPixmap closeFilepix("D:/code/Qt/test_QStackedWidget/closeFile.png");
    QPixmap infopix("D:/code/Qt/test_QStackedWidget/info.png");
    QPixmap settingspix("D:/code/Qt/test_QStackedWidget/settings.png");
 
    QStackedWidget *leftStack = new QStackedWidget;
    QStackedWidget *centralStack = new QStackedWidget;
    leftStack->setMinimumWidth(200);
    QWidget *rightWidget = new QWidget;
    rightWidget->setMinimumWidth(300);
 
    QSplitter *mainVSplitter = new QSplitter(Qt::Horizontal);
    mainVSplitter->setSizes(QList<int>({INT_MAX, INT_MAX, INT_MAX}));
    mainVSplitter->addWidget(leftStack);
    mainVSplitter->addWidget(centralStack);
    mainVSplitter->addWidget(rightWidget);
 
    mainVSplitter->setStretchFactor(0,1);
    mainVSplitter->setStretchFactor(1,8);
    mainVSplitter->setStretchFactor(2,1);
 
    hBoxFull->addWidget(leftToolBar);
    hBoxFull->addWidget(mainVSplitter);
 
    QWidget *spring = new QWidget();
    spring->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
    QAction *search = leftToolBar->addAction(QIcon(searchpix), "Поиск");
    QObject::connect(search, &QAction::triggered, qApp, &QApplication::quit);
    QAction *explorer = leftToolBar->addAction(QIcon(explorerpix), "Проводник");
    QAction *openFile = leftToolBar->addAction(QIcon(openFilepix), "Открыть файл");
    QAction *createFile = leftToolBar->addAction(QIcon(createFilepix), "Создать файл");
    QAction *saveFile = leftToolBar->addAction(QIcon(saveFilepix), "Сохранить файл");
    QAction *closeFile = leftToolBar->addAction(QIcon(closeFilepix), "Закрыть файл");
    leftToolBar->addWidget(spring);
    QAction *info = leftToolBar->addAction(QIcon(infopix), "Справка");
    QAction *settings = leftToolBar->addAction(QIcon(settingspix), "Настройки");
 
    QTextEdit *centralTextEdit = new QTextEdit;
 
    centralStack->addWidget(centralTextEdit);
 
    w.setLayout(hBoxFull);
 
    w.show();
    return a.exec();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2024, 12:35
Ответы с готовыми решениями:

Как установить размеры comboBox
Подскажите как сделать что бы comboBox не выходил за приделы программы?

Как установить размеры окна?
Здравствуйте, как установить размеры главного окна ? Любого , MainWindow к nримеру

Как в Excel установить размеры ячеек?
Как в Excel установить размеры ячеек чтобы при печати получить определенные размеры. Есть готовый...

Как установить размеры окна программно?
Как установить размеры окна MainWindow (QMainWindow) программно?

9
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,048
02.03.2024, 18:51 2
Я тупо через QSettings геометрию окна сохраняю. Один раз настроил и забыл.
1
1063 / 670 / 181
Регистрация: 30.03.2021
Сообщений: 2,088
02.03.2024, 20:03 3
Цитата Сообщение от AmbA Посмотреть сообщение
Как установить предпочтительные размеры в QSplitter
Цитата Сообщение от AmbA Посмотреть сообщение
с которыми он бы стартовал?
делаешь это тут:
Цитата Сообщение от AmbA Посмотреть сообщение
mainVSplitter->setSizes(QList<int>({INT_MAX, INT_MAX, INT_MAX}));
Не понимаю описание проблемы и конечный результат, и зачем такая странная компоновка.
Почему-то мне подумалось, что тут была попытка слайдером уменьшать вертикальный тулбар до иконок или увеличивать на ширину иконок с текстом...

Если так -то вот, слегка переделал:
Кликните здесь для просмотра всего текста

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <QApplication>
#include <QHBoxLayout>
#include <QToolBar>
#include <QAction>
#include <QScreen>
#include <QSplitter>
#include <QTextEdit>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QWidget w;
    QHBoxLayout *hBoxFull = new QHBoxLayout;
    w.setLayout(hBoxFull);
    const QRect aG = w.screen()->availableGeometry();
    w.resize((aG.width() * 4) / 5, (aG.height() * 4) / 5);
    w.move((aG.width() - w.width()) / 2, (aG.height() - w.height()) / 2);
 
    QPixmap searchpix("D:/code/Qt/test_QStackedWidget/search.png");
    QPixmap explorerpix("D:/code/Qt/test_QStackedWidget/explorer.png");
    QPixmap openFilepix("D:/code/Qt/test_QStackedWidget/openFile.png");
    QPixmap createFilepix("D:/code/Qt/test_QStackedWidget/createFile.png");
    QPixmap saveFilepix("D:/code/Qt/test_QStackedWidget/saveFile.png");
    QPixmap closeFilepix("D:/code/Qt/test_QStackedWidget/closeFile.png");
    QPixmap infopix("D:/code/Qt/test_QStackedWidget/info.png");
    QPixmap settingspix("D:/code/Qt/test_QStackedWidget/settings.png");
 
    const int ICON_SIZE=40, TOOL_MIN_WIDTH=ICON_SIZE+10;
 
    QToolBar *leftToolBar = new QToolBar;
    leftToolBar->setOrientation(Qt::Vertical);
    leftToolBar->setIconSize(QSize(ICON_SIZE, ICON_SIZE));
    leftToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
 
    QWidget *spring = new QWidget();
    spring->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
    QAction *search = leftToolBar->addAction(QIcon(searchpix), "Поиск");
    QObject::connect(search, &QAction::triggered, qApp, &QApplication::quit);
    QAction *explorer = leftToolBar->addAction(QIcon(explorerpix), "Проводник");
    QAction *openFile = leftToolBar->addAction(QIcon(openFilepix), "Открыть файл");
    QAction *createFile = leftToolBar->addAction(QIcon(createFilepix), "Создать файл");
    QAction *saveFile = leftToolBar->addAction(QIcon(saveFilepix), "Сохранить файл");
    QAction *closeFile = leftToolBar->addAction(QIcon(closeFilepix), "Закрыть файл");
    leftToolBar->addWidget(spring);
    QAction *info = leftToolBar->addAction(QIcon(infopix), "Справка");
    QAction *settings = leftToolBar->addAction(QIcon(settingspix), "Настройки");
 
    //выровнять кнопки тулбара по левому краю
    if(QLayout* layout = leftToolBar->layout(); layout->count()>0)
        for(int i = 0; i < layout->count(); i++)
            layout->itemAt(i)->setAlignment(Qt::AlignLeft);
    leftToolBar->setMinimumWidth(TOOL_MIN_WIDTH);
    leftToolBar->setMaximumWidth(leftToolBar->sizeHint().width());
 
    QTextEdit *centralTextEdit = new QTextEdit;
 
    QWidget *rightWidget = new QWidget;
    rightWidget->setMinimumWidth(300);
 
    QSplitter *mainVSplitter = new QSplitter(Qt::Horizontal);
    mainVSplitter->setChildrenCollapsible(false); //запретить схлопывание
    hBoxFull->addWidget(mainVSplitter);
 
    //слайдер движется, меняем тип кнопок тулбара в зависимости от его позиции "иконка" - "иконка и текст"
    QObject::connect(mainVSplitter, &QSplitter::splitterMoved, [leftToolBar, TOOL_MIN_WIDTH](int pos, int idx){
        const auto maxWidth=leftToolBar->maximumWidth();
        if(idx==1 && pos< TOOL_MIN_WIDTH+20)
            leftToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
        else if(idx==1)
            leftToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
 
        leftToolBar->setMinimumWidth(TOOL_MIN_WIDTH);
        leftToolBar->setMaximumWidth(maxWidth);
    });
 
    mainVSplitter->addWidget(leftToolBar);
    mainVSplitter->addWidget(centralTextEdit);
    mainVSplitter->addWidget(rightWidget);
    //сплиттер стартует с рекомендуемыми размерами виджетов
    mainVSplitter->setSizes({leftToolBar->minimumSizeHint().width(),
                             centralTextEdit->sizeHint().width(),
                             rightWidget->sizeHint().width()});
 
    w.show();
    return a.exec();
}
1
46 / 22 / 6
Регистрация: 09.06.2017
Сообщений: 285
Записей в блоге: 18
03.03.2024, 07:54  [ТС] 4
Это своего рода QtitanRibbon, только бесплатный, попроще и вертикальный (пока. Можно перетаскиваемым сделать. Наверное). Как в Word-е. Примерно:
Кликните здесь для просмотра всего текста

Каждой кнопке QAction на тулбаре соответствует целый виджет (полоса сверху донизу) со своим меню (и состояние главного окна тоже, видимо. Пока не продумал до конца). Я просто их туда ещё не накидал, в стэквиджет. Отказался от QTabWidget для этой цели, ибо прочёл, что команды с неактивных вкладок не выполняются.

Я вот ещё посмотрел, и думаю, что для левой панели такое поведение, как сейчас, норм. А вот для правой всё-таки с натяжкой.


C++ (Qt)
1
mainVSplitter->setSizes(QList<int>({INT_MAX, INT_MAX, INT_MAX}));
- не похоже, чтоб работал. Если его убрать, то ничего не меняется.


Есть вопросы по
C++ (Qt)
1
if(QLayout* layout = leftToolBar->layout(); layout->count()>0)
В описании к layout() сказано: Возвращает менеджер макетов, установленный в этом виджете, или nullptr, если менеджер компоновки не установлен. То есть тут создаётся указатель на объект QLayout, и ему присваивается адрес. Но! Мы не устанавливали в leftToolBar никакой layout. Он там есть по умолчанию, или что?


Здесь
C++ (Qt)
1
leftToolBar->setMaximumWidth(leftToolBar->sizeHint().width());
sizeHint(): Это свойство содержит рекомендуемый размер виджета. А кто и когда его рекомендовал? На предыдущей
C++ (Qt)
1
leftToolBar->setMinimumWidth(TOOL_MIN_WIDTH);
строчке? У меня вообще с Hint-ами непонятки. Это получение информации об объекте (в частности, size - размер)?


Можно пояснить за idx
C++ (Qt)
1
QObject::connect(mainVSplitter, &QSplitter::splitterMoved, [leftToolBar, TOOL_MIN_WIDTH](int pos, int idx)
? То есть это индекс перетаскиваемой полоски, и нумерация начинается с 1? А, да. Прикольно. Если поменять, то можно таскать правую полоску, а кнопки будут сворачиваться )


Зачем повторная установка размера в лямбде
C++ (Qt)
1
2
leftToolBar->setMinimumWidth(TOOL_MIN_WIDTH);
leftToolBar->setMaximumWidth(maxWidth);
?


C++ (Qt)
1
2
3
4
//сплиттер стартует с рекомендуемыми размерами виджетов
    mainVSplitter->setSizes({leftToolBar->minimumSizeHint().width(),
                             centralTextEdit->sizeHint().width(),
                             rightWidget->sizeHint().width()});
- не-а. Центр сужается:
Кликните здесь для просмотра всего текста
Миниатюры
Как установить предпочтительные размеры в QSplitter  
0
1063 / 670 / 181
Регистрация: 30.03.2021
Сообщений: 2,088
03.03.2024, 13:18 5
ответы
Кликните здесь для просмотра всего текста

Цитата Сообщение от AmbA Посмотреть сообщение
для правой всё-таки с натяжкой.
правую панель я вообще никак не мутил, она пустая у тебя,- можно будет делать по аналогии с тулбаром, например. Это уже сам.
Цитата Сообщение от AmbA Посмотреть сообщение
можно таскать правую полоску, а кнопки будут сворачиваться )
угу, есть такое - имхо так не должно быть, но я хз как это пофиксить, поэтому сделал возможно костыльно.
Цитата Сообщение от AmbA Посмотреть сообщение
не похоже, чтоб работал. Если его убрать, то ничего не меняется.
хз, возможно другими настройками перекрывается. У меня вроде работает.
Цитата Сообщение от AmbA Посмотреть сообщение
Мы не устанавливали в leftToolBar никакой layout. Он там есть по умолчанию, или что?
да, после добавления контента.
Цитата Сообщение от AmbA Посмотреть сообщение
sizeHint(): Это свойство содержит рекомендуемый размер виджета. А кто и когда его рекомендовал?
это размер виджета после применения к нему настроек (шрифтов и тд) и размещения в компоновке.
Цитата Сообщение от AmbA Посмотреть сообщение
Зачем повторная установка размера в лямбде
если убрать-то все ломается... наверное, смена типа QToolButton сбрасывает эти настройки.

сделал одинаковую длинну кнопок тулбара для красоты, убрал перемещение первой ручки тулбара, если близко подводим вторую ручку (возможно, костыли- хз как это делать по феншую, так же ручки сдвигаются при ресайзе окна-тоже можно пофиксить, но не делал. И вообще, это пример на коленке- учесть все нюансы и допилить оставляю тебе )
Кликните здесь для просмотра всего текста
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <QApplication>
#include <QHBoxLayout>
#include <QToolBar>
#include <QAction>
#include <QScreen>
#include <QSplitter>
#include <QTextEdit>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("fusion");
    QWidget w;
    QHBoxLayout *hBoxFull = new QHBoxLayout;
    w.setLayout(hBoxFull);
    const QRect aG = w.screen()->availableGeometry();
    w.resize((aG.width() * 4) / 5, (aG.height() * 4) / 5);
    w.move((aG.width() - w.width()) / 2, (aG.height() - w.height()) / 2);
 
   QPixmap searchpix("D:/code/Qt/test_QStackedWidget/search.png");
    QPixmap explorerpix("D:/code/Qt/test_QStackedWidget/explorer.png");
    QPixmap openFilepix("D:/code/Qt/test_QStackedWidget/openFile.png");
    QPixmap createFilepix("D:/code/Qt/test_QStackedWidget/createFile.png");
    QPixmap saveFilepix("D:/code/Qt/test_QStackedWidget/saveFile.png");
    QPixmap closeFilepix("D:/code/Qt/test_QStackedWidget/closeFile.png");
    QPixmap infopix("D:/code/Qt/test_QStackedWidget/info.png");
    QPixmap settingspix("D:/code/Qt/test_QStackedWidget/settings.png");
 
    const int ICON_SIZE=40, TOOL_MIN_WIDTH=ICON_SIZE+10;
 
    QToolBar *leftToolBar = new QToolBar;
    leftToolBar->setOrientation(Qt::Vertical);
    leftToolBar->setIconSize(QSize(ICON_SIZE, ICON_SIZE));
    leftToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
 
    QWidget *spring = new QWidget();
    spring->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
    QAction *search = leftToolBar->addAction(QIcon(searchpix), "Поиск");
    QObject::connect(search, &QAction::triggered, qApp, &QApplication::quit);
    QAction *explorer = leftToolBar->addAction(QIcon(explorerpix), "Проводник");
    QAction *openFile = leftToolBar->addAction(QIcon(openFilepix), "Открыть файл");
    QAction *createFile = leftToolBar->addAction(QIcon(createFilepix), "Создать файл");
    QAction *saveFile = leftToolBar->addAction(QIcon(saveFilepix), "Сохранить файл");
    QAction *closeFile = leftToolBar->addAction(QIcon(closeFilepix), "Закрыть файл");
    leftToolBar->addWidget(spring);
    QAction *info = leftToolBar->addAction(QIcon(infopix), "Справка");
    QAction *settings = leftToolBar->addAction(QIcon(settingspix), "Настройки");
 
    if(QLayout* layout = leftToolBar->layout(); layout->count()>0)
        for(int i=0; i< layout->count(); i++){
            layout->itemAt(i)->setAlignment(Qt::AlignLeft);
            layout->itemAt(i)->widget()->setFixedWidth(leftToolBar->sizeHint().width());//ширина кнопки тулбара
        }
    leftToolBar->setMinimumWidth(TOOL_MIN_WIDTH);
    leftToolBar->setMaximumWidth(leftToolBar->sizeHint().width());
 
    QTextEdit *centralTextEdit = new QTextEdit;
    centralTextEdit->setMinimumWidth(TOOL_MIN_WIDTH);
 
    QWidget *rightWidget = new QWidget;
    rightWidget->setMinimumWidth(300);
 
    QSplitter *mainVSplitter = new QSplitter(Qt::Horizontal);
    mainVSplitter->setChildrenCollapsible(false);
    hBoxFull->addWidget(mainVSplitter);
    QObject::connect(mainVSplitter, &QSplitter::splitterMoved,
                     [leftToolBar, centralTextEdit, TOOL_MIN_WIDTH](int pos, int idx){
 
                         if(idx==1){
                             const auto maxWidth=leftToolBar->maximumWidth();
                             const auto minWidth=leftToolBar->minimumWidth();
                             int width;
 
                             if(pos< TOOL_MIN_WIDTH+20){
                                 leftToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
                                 width=minWidth;
                             }
                             else{
                                 leftToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
                                 width=maxWidth;
                             }
 
                             leftToolBar->setMinimumWidth(TOOL_MIN_WIDTH);
                             leftToolBar->setMaximumWidth(maxWidth);
                             if(QLayout* layout = leftToolBar->layout(); layout->count()>0)
                                 for(int i = 0; i < layout->count(); ++i){
                                     layout->itemAt(i)->setAlignment(Qt::AlignLeft);
                                     layout->itemAt(i)->widget()->setFixedWidth(width);
                                 }
                         }
                         //устранение влияния второй ручки тулбара на первую. Возможно, это костыль
                         //и есть более правильный способ
                         else if(idx==2 && centralTextEdit->width()==centralTextEdit->minimumWidth() ){
                             leftToolBar->setMinimumWidth(leftToolBar->size().width()); 
                         }
                     });
 
 
    mainVSplitter->addWidget(leftToolBar);
    mainVSplitter->addWidget(centralTextEdit);
    mainVSplitter->addWidget(rightWidget);
 
 
    mainVSplitter->setSizes({leftToolBar->minimumSizeHint().width(),
                             centralTextEdit->sizeHint().width(),
                             rightWidget->sizeHint().width()});
    w.show();
    return a.exec();
}


Добавлено через 1 час 29 минут
Цитата Сообщение от AmbA Посмотреть сообщение
Центр сужается
видимо из-за того, что правый виджет пустой и никак не настроен, QSplitter выставляет рекомендованный размер среднего, а правый-как получится. Попробуй накидать в него контента или сделать setMaximumWidth()-тогда левый и правый должны иметь определенную ширину, а средний-как получится... Все это выясняется и подгоняется в процессе.
2
46 / 22 / 6
Регистрация: 09.06.2017
Сообщений: 285
Записей в блоге: 18
19.03.2024, 10:36  [ТС] 6
Цитата Сообщение от sdf45 Посмотреть сообщение
C++ (Qt)
1
2
3
4
//выровнять кнопки тулбара по левому краю
 if(QLayout* layout = leftToolBar->layout(); layout->count()>0)
   for(int i = 0; i < layout->count(); i++)
     layout->itemAt(i)->setAlignment(Qt::AlignLeft);
Создаём указатель на QLayout, и присваиваем ему адрес макета, содержащегося в QToolBar; если макет не пустой
то перебираем все элементы в нём,
и каждому создаём макет, а к макету применяем выравнивание.

То есть теперь каждый QAction лежит в двух макетах: изначальный общий в QToolBar, и отдельный для каждого QAction.

Всё верно?
0
1063 / 670 / 181
Регистрация: 30.03.2021
Сообщений: 2,088
19.03.2024, 13:06 7
Цитата Сообщение от AmbA Посмотреть сообщение
Создаём указатель на QLayout, и присваиваем ему адрес макета, содержащегося в QToolBar; если макет не пустой то перебираем все элементы в нём,
да.
Цитата Сообщение от AmbA Посмотреть сообщение
каждый QAction лежит в двух макетах: изначальный общий в QToolBar, и отдельный для каждого QAction.
нет, QAction -не виджет, он не может лежать в макете. Когда добавляешь QAction в QToolBar - создается QToolButton и добавляется в макет тулбара.

Цитата Сообщение от AmbA Посмотреть сообщение
и каждому создаём макет, а к макету применяем выравнивание.
нет, layout->itemAt(i) возвращает QLayoutItem* (в котором лежит указатель на виджет) c индексом i из макета тулбара, все виджеты тулбара лежат в его макете -виджет не может лежать в нескольких макетах одновременно (а, например, QAction можно передать в несколько тулбаров, т.к. он унаследован напрямую от QObject)
1
46 / 22 / 6
Регистрация: 09.06.2017
Сообщений: 285
Записей в блоге: 18
19.03.2024, 13:41  [ТС] 8
Ага. Где были мои глаза ) Возвращается элемент-в-макете-по-индексу (QToolButton в данном случае), и к нему применяется выравнивание в рамках макета тулбара.
0
46 / 22 / 6
Регистрация: 09.06.2017
Сообщений: 285
Записей в блоге: 18
20.03.2024, 10:50  [ТС] 9
Чушь я написал.
Ещё раз.
В QToolBar-е есть макет. При добавлении QAction на тулбар под него создаётся QToolButton, и добавляется в макет QToolBar-а. В один макет. Все QToolButton-ы в один макет.
Метод layout->itemAt(i) возвращает указатель на QLayoutItem. Что такое QLayoutItem? Что значит "предоставляет абстрактный элемент, которым управляет QLayout"? Это некая запись, содержащая данные о виджете (в данном случае - QToolButton-е) (и указатель на него)? То есть класс, описывающий и регулирующий положение виджета в макете? То есть у каждого виджета в Layout-е есть QLayoutItem.
0
1063 / 670 / 181
Регистрация: 30.03.2021
Сообщений: 2,088
20.03.2024, 12:59 10
Цитата Сообщение от AmbA Посмотреть сообщение
Это некая запись, содержащая данные о виджете (в данном случае - QToolButton-е) (и указатель на него)? То есть класс, описывающий и регулирующий положение виджета в макете? То есть у каждого виджета в Layout-е есть QLayoutItem.
да.

В справке написано "This is used by custom layouts."
Если сделать так:
C++ (Qt)
1
2
    QToolBar b;
    qDebug()<<b.children();
То выведет что-то вроде QList(QToolBarLayout(), ...) - внутри некий кастомный QToolBarLayout, чье поведение, видимо, отличается от стандартных QVBoxLayout, QHBoxLayout и пр. QLayoutItem нужен, что бы реализовать это поведение.
1
20.03.2024, 12:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2024, 12:59
Помогаю со студенческими работами здесь

Как установить размеры и положение нового окна?
Новое окно создается вот таким кодом: &lt;a href=&quot;#&quot; onClick=&quot;winObj = window.open...

Как установить размеры для всех телефонов равные?
Все никак не пойму как сделать сцену чтобы она выглядела по размерам на всех телефонах одинаково,...

Как установить размеры панелей при растягивании формы
На форме располагаются вертикально 3 панели для отрисовки графических примитивов. При программном...

Как добавить кнопку на QSplitter
Как добавить кнопку на QSplitter? Наподобии того как это реализовано в Gwenview:

Как растянуть QScrollArea по QSplitter?
В общем необходимо растянуть QScrollArea по QSplitter. Т.к. по дефолту получаю что то подобное:...

Как закрасить разделитель QSplitter определенным цветом?
Как закрасить разделитель QSplitter определенным цветом?Точнее ту полоску, которая разделяет виджеты

QSplitter + childrenCollapsible: как получить сигнал о скрытии виджета?
Добрый день всем! Разместил виджеты в сплиттере, задал childrenСollapsible. Если тяну сплиттер...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru