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