crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> 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  


Так чтоль?

    int hwidth = 0;
    for (int i = 0; i < ui->tableWidget->horizontalHeader()->count(); ++i)
        hwidth += ui->tableWidget->horizontalHeader()->sectionSize(i);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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.

Цитата(flankerr @ 17.9.2009, 11:20) *
Однако есть ещё 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(), чтобы поставить в очередь выполнение метода, когда запустится цикл событий.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 10:34