QDockWidget & resize, Начальный размер для QDockWidget |
Здравствуйте, гость ( Вход | Регистрация )
QDockWidget & resize, Начальный размер для QDockWidget |
DmP |
14.6.2009, 3:11
Сообщение
#1
|
Студент Группа: Участник Сообщений: 61 Регистрация: 11.3.2008 Пользователь №: 116 Спасибо сказали: 15 раз(а) Репутация: 2 |
Привет!
Вот задумался над тем, как задать начальный размер для QDockWidget. Не всегда хочется переопределять sizeHint(). Получился такой хак, позволяющий задать размер для нижнего дока, может кому пригодится:
Да, код написан на Qt 4.5.1 |
|
|
SABROG |
14.6.2009, 13:56
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Я сделал небольшой моддинг твоего кода сократив его до одной строки
|
|
|
DmP |
14.6.2009, 14:41
Сообщение
#3
|
Студент Группа: Участник Сообщений: 61 Регистрация: 11.3.2008 Пользователь №: 116 Спасибо сказали: 15 раз(а) Репутация: 2 |
SABROG, был у меня вариант с layout(), но отладчик упорно не хотел сознаваться в том, какое настоящее имя класса и в процессе разбора полетов этот вариант потерялся. Сейчас сократил код до:
У меня потом будет левая и правая панелька. А для однострочного варианта, одна скобка лишняя
|
|
|
SABROG |
14.6.2009, 15:19
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
А для однострочного варианта, одна скобка лишняя Поспорим, что нет? SABROG, был у меня вариант с layout(), но отладчик упорно не хотел сознаваться в том, какое настоящее имя класса А я просто обошел рекурсией всё дерево и потом сравнил указатели. Кстати еще такой вариант работает:
Сообщение отредактировал SABROG - 14.6.2009, 15:25 |
|
|
DmP |
14.6.2009, 17:29
Сообщение
#5
|
Студент Группа: Участник Сообщений: 61 Регистрация: 11.3.2008 Пользователь №: 116 Спасибо сказали: 15 раз(а) Репутация: 2 |
У меня работает. А я просто обошел рекурсией всё дерево и потом сравнил указатели. Кстати еще такой вариант работает:
Но никто не гарантирует, что они вдруг не поменяют имя объекта. Странно то, что по идее самый правильный вариант:
Компилируется, но не линкуется, видимо не все полезное экспортируется. |
|
|
SABROG |
14.6.2009, 17:43
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
У меня работает. В каком виде? Странно то, что по идее самый правильный вариант: О ровно такой же правильный как и жесткая привязка к названию объекта "_layout" и вообще как и сам хак. Кстати почему такое не работает?
Сообщение отредактировал SABROG - 14.6.2009, 17:46 |
|
|
BRE |
14.6.2009, 18:20
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Кстати почему такое не работает?
Это только предположение, я не проверял. Думаю это из-за того, что rect может быть не валиден ( height <= 0 || width <= 0 ). Конструктор по умолчанию, как раз создает такую область. В этом случае, ты устанавливаешь height, а width не изменяется. |
|
|
DmP |
14.6.2009, 19:03
Сообщение
#8
|
Студент Группа: Участник Сообщений: 61 Регистрация: 11.3.2008 Пользователь №: 116 Спасибо сказали: 15 раз(а) Репутация: 2 |
В каком виде? Вот так, как и написано: ((QMainWindowLayout*)layout())->layoutState.dockAreaLayout.docks[QInternal::BottomDock].rect = QRect(0, 0, 0, 100); А зачем dockAreaLayout в скобки брать? О ровно такой же правильный как и жесткая привязка к названию объекта "_layout" и вообще как и сам хак. О нет, поменять имя класса проблематично, нужно править кучу кода. А поменять имя объекта - всего одна строка и ни чему это не повредит. А то, что хак может перестать работать в любой следующей версии, так это да, не спорю. |
|
|
SABROG |
14.6.2009, 20:06
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
А зачем dockAreaLayout в скобки брать? А хрен его знает, наверно планировал приводить к другому указателю, я вообще думал, что ты об этих "())->" Просто если кому интересно, то тролли в своем факе предлагают sizeHint переопределять у виджета, который будет помещаться на доквиджет: http://www.qtsoftware.com/developer/faqs/550 Это только предположение Скорее всего ты прав, на этапе создания главной формы детки еще не знают своего rect'a.
Соответственно так все работает
P.S.: кстати я так и не понял зачем это нужно. Зачем устанавливать предварительный размер пустому доквиджету? Зачем вообще в программе нужен пустой доквиджет? Рисовать на нем чтоль? На худой конец работает setMinimumHeight() для виджета. А если не пустой, то он всё равно изменится при размещении в него виджетов. А там можно и setMinimumHeight отрубить при добавлении. Сообщение отредактировал SABROG - 14.6.2009, 20:38 |
|
|
DmP |
14.6.2009, 21:26
Сообщение
#10
|
Студент Группа: Участник Сообщений: 61 Регистрация: 11.3.2008 Пользователь №: 116 Спасибо сказали: 15 раз(а) Репутация: 2 |
P.S.: кстати я так и не понял зачем это нужно. Зачем устанавливать предварительный размер пустому доквиджету? Зачем вообще в программе нужен пустой доквиджет? Рисовать на нем чтоль? На худой конец работает setMinimumHeight() для виджета. А если не пустой, то он всё равно изменится при размещении в него виджетов. А там можно и setMinimumHeight отрубить при добавлении. А кто сказал что он пустой? И уж тем более я не предлагал таким методом изменять размер док-виджета после его появления. А setMinimumHeight() зачем? что бы потом нельзя было уменьшить док? Была тривиальная задача, при создании QMainWindow, расставить док-виджеты с нужными мне размерами, при этом оставляя возможность менять размер их в дальнейшем, и не переопределяя sizeHint() у QTableWidget и у QTextEdit. SABROG, если тебе не понятно зачем это все, так зачем ты начал это все использовать? Да следует уточнить, что данный метод должен вызываться, после создания всех доков. И действует не на какой то док отдельно, а в целом задет размер стороны, в данном случай всех нижних. Работает аналогично QMainWindow::restoreState(). |
|
|
Текстовая версия | Сейчас: 23.11.2024, 6:45 |