QHeaderView Как узнать ширину ВСЕЙ области заголовка ? |
Здравствуйте, гость ( Вход | Регистрация )
QHeaderView Как узнать ширину ВСЕЙ области заголовка ? |
flankerr |
16.9.2009, 17:19
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Есть диалог на нём есть QTreeView надо узнать ширину заголовка для того чтобы правильно установить размеры колонок.
QTreeView::size().width(); выдаёт адекватный размер ,но ширина заголовка(QHeaderView) меньше чем ширина QTreeView, поэтому использовать ширину QTreeView нельзя иначе появляется горизонтальная прокрутка. header()->viewport()->size().width(); header()->size().width(); Эти два метода выдают одинаковый результат и он тоже не тенят на искомый (на порядок меньший) Сообщение отредактировал flankerr - 16.9.2009, 17:37 |
|
|
Rocky |
16.9.2009, 17:23
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
QTreeView::columnWidth() пробовал?
|
|
|
flankerr |
16.9.2009, 17:35
Сообщение
#3
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Rocky, Ты не понял вопроса. Вопрос НЕ в том чтобы узнать ширину конкретной колонки. Вопрос в том чтобы узнать общую ширину ВСЕЙ ОБЛАСТИ выделенной для заголовка
Сумма всех колонок НЕ РАВНА ширине выделенной области под заголовок! Смысл в том что надо реализовать свойство Stretch для нужной мне колнки. Т.е ровно то что делает header()->setStretchLastSection(false); только не для последней а для какойто другой колонки header()->setResizeMode(2,QHeaderView::Stretch); в Qt 4.3.3 данный метод приводит к установки свойства Stretch ко ВСЕМ колонкам начиная с указанной (в моём примере со 2ой) У меня нет возмоности перейти на более новые версии Qt и не факт что там это исправлено поэтому нужо реализовать это руками. А для этого надо знать ширину области отведённой под заголовок и отнять от неё размеры известных мне колонок чтобы получить искомую ширину колонки. Сообщение отредактировал flankerr - 16.9.2009, 17:54 |
|
|
SABROG |
16.9.2009, 18:53
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Так чтоль?
|
|
|
Litkevich Yuriy |
17.9.2009, 7:47
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
не забывайте, что объекты возвращающие QRect имеют нюанс с точностью
|
|
|
flankerr |
17.9.2009, 10:20
Сообщение
#6
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
SABROG,
Читай внимательней;) "Сумма всех колонок НЕ РАВНА ширине выделенной области под заголовок!" Уж не знаю как ещё объяснить то... надо сделать руками то что делает автоматом вызов header()->setResizeMode(2,QHeaderView::Stretch); точнее то что должен делать но НЕ делает! Совсем на пальцах в наджеде что так меня уж тчоно поймут: Допустим Х1 это ширина первой колонки Х2 ширина второй колонки Х3 ширина третье колонки. Y - это сумма всех колонок. Получаем Х1 + Х2 + Х3 = Y1 Однако есть ещё Z - ширина области видимости и Z не равна Y Задача: Найти такое Х2 при котором Y будет равно Z Эта задачка для Х3 решается вызовом setStretchLastSection Для не последней, а прозвольной колонки должна решаться вызовом header()->setResizeMode(Х2,QHeaderView::Stretch); Однако в Qt4.3.3 содержиться БАГ и это функция НЕ работает! ps: Rocky и SABROG, вы предлогаете искать Y а мне надо узнать Z Сообщение отредактировал flankerr - 17.9.2009, 10:21 |
|
|
flankerr |
17.9.2009, 11:22
Сообщение
#7
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Нашёля весьма любопытный момент.
1. Искомая мной величина находиться к примеру вызовом header().size().width() 2. resizeEvent приходит раньше чем просиходит пересчёт новых значений.Т.е. использовать для моих целей resizeEvent нельзя. |
|
|
SABROG |
17.9.2009, 12:55
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
"Сумма всех заголовков" равна её количеству, т.е. если у нас 6 заголовков, то их сумма будет 6. Именно так можно интерпретировать то, что ты написал.
Что-то у меня совсем нет желания разбираться со старой версией Qt. Однако есть ещё Z - ширина области видимости и Z не равна Y Если "область видимости" это тот белый квадратик, который называется viewport(), то ширина viewport()'a или horizontalHeader()'a и будет твоей Z. Сообщение отредактировал SABROG - 17.9.2009, 12:57 |
|
|
flankerr |
17.9.2009, 15:24
Сообщение
#9
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
SABROG, Проблема была в том что смотрел значения в resizeEvent родителя а надо было в resizeEvent потомка. Поэтому у меня header().size().width() выдавал старые значения (при старте окна - значения по умолчанию). Поэтому у меня и не сходилось по логике должно быть одно а на практике - другое.
Сейчас вопрос решён спасибо за внимание PS что касаемо старых версий Qt. Как показала практика прога собранная на Qt 4.2.1 во все НЕ факт что будет корректно работаьт с DLL от 4.3.3 Когда есть всего одна программа то проблем нет - пересобрать под новой версией и все. А вот когда таких программ несколько десятков и этими программами пользуються по всей стране то вопрос совместимости встаёт весьма остро. С каждой программой поставлять комплект Qt библиотек это не вариант. |
|
|
SABROG |
17.9.2009, 16:13
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Это решается через QTimer::singleShot() или QMetaObject::invokeMethod(), чтобы поставить в очередь выполнение метода, когда запустится цикл событий.
|
|
|
Текстовая версия | Сейчас: 18.12.2024, 13:54 |