Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: spbtellurian от Ноябрь 19, 2009, 14:36



Название: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 19, 2009, 14:36
Как в заголовок (QHeaderView) помимо текста вставить CheckBox ???
Ну кпримеру в QAbstractItemModel есть возможность вставлять чекбоксы в ячейки а вот как это сделать в заголовок ???


Название: Re: CheckBox в QHeaderView
Отправлено: Hordi от Ноябрь 19, 2009, 16:05
Давай мыло - скину честно украденный и переделанный класс...


Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 19, 2009, 17:53
спасибо :)
см личку


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 19, 2009, 18:18
Как в заголовок (QHeaderView) помимо текста вставить CheckBox ???
можешь привести задачу, где это необходимо?
чета как не напрягался не смог придумать...


Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 19, 2009, 19:29
можешь привести задачу, где это необходимо? чета как не напрягался не смог придумать...
Странно т.к. задачка встречается повсеместно. Групповые операции.

Ну скажем есть у тебя таблица во всех ячках одной из колонок есть чекбоксы. Весьма распространенная ситуация. А теперь представим что надо все чекбоксы установить\снять. Когда строк в таблице (читай чекбоксов) две-три ну наверно можно три раза кликнуть мышкой а когда строк с несколько десятков.
Конечно можно тупо и упорно кликать по всем чекбоксам но гораздо быстрее и удобнее кликнуть один раз в заголовке.

Есть альтернатива – менее очевидная и менее удобная – вместо одного действия (клик в заголовке) делать два действия – выбор всей колонки и клик по любому из чекбоксов в колонке. Но это гораздо менее красивое и менее очевидное решение.




Название: Re: CheckBox в QHeaderView
Отправлено: NicK от Ноябрь 19, 2009, 20:05
можно просто добавить соответствующий пункт в контекстное меню.


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 19, 2009, 21:32
можно просто добавить соответствующий пункт в контекстное меню.
+500
Странно т.к. задачка встречается повсеместно. Групповые операции.Ну скажем есть у тебя таблица во всех ячках одной из колонок есть чекбоксы.
плохое решение, я обычно для таких целей пользуюсь патерном посетитель:
Написал один раз обход модели, передал алгоритм или выбрал алгоритм с пом. того-же выпадающего меню и опля, везде чекбоксы расставлены или еще чего. Меньше кода писать приходится.


Название: Re: CheckBox в QHeaderView
Отправлено: break от Ноябрь 20, 2009, 01:27
Цитировать
плохое решение, я обычно для таких целей пользуюсь патерном посетитель:
Написал один раз обход модели, передал алгоритм или выбрал алгоритм с пом. того-же выпадающего меню и опля, везде чекбоксы расставлены или еще чего. Меньше кода писать приходится.

Причем тут паттерны? Автора интересовал вопрос построения интерффейса (никто не говорит что саму операцию скрывающуюся за выделением чекбокса в заголовке он не будет реализовывать с помощью того же шаблона проходящего по всей модели) - и если выпадающее меню и является решением - то менее очевидным для пользователя - т.к. 1 - в каком контекстном меню - наверное в меню заголовка столбца а не строки т.к. контекстное меню строки относится к строке, а контекстное меню вызывать щелкая по стоблцу - это еще надо догадаться - "тупой" пользователь этого сразу не поймет. А вот чекбокс - отлично и наглядно - вспомните формы почтовых клиентов в интернете - где все письма выделяются именно таким образом!


Название: Re: CheckBox в QHeaderView
Отправлено: Sergey B. от Ноябрь 20, 2009, 10:08
Код:
QVariant QSqlQueryModel::headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const 


Название: Re: CheckBox в QHeaderView
Отправлено: Hordi от Ноябрь 20, 2009, 11:43
Код:
QVariant QSqlQueryModel::headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const 

И чем это может помочь?


Название: Re: CheckBox в QHeaderView
Отправлено: Sergey B. от Ноябрь 20, 2009, 12:04
Код:
Qt::CheckStateRole


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 20, 2009, 12:09
Цитировать
плохое решение, я обычно для таких целей пользуюсь патерном посетитель:
Написал один раз обход модели, передал алгоритм или выбрал алгоритм с пом. того-же выпадающего меню и опля, везде чекбоксы расставлены или еще чего. Меньше кода писать приходится.
Причем тут паттерны? Автора интересовал вопрос построения интерффейса.....
А при том, что при разрастании функционала никаких экранов не хватит, что-бы "заочевиднить" функцию.
Правильно учитесь писать программы.... моники не резиновые....


Название: Re: CheckBox в QHeaderView
Отправлено: Hordi от Ноябрь 20, 2009, 12:14
Код:
Qt::CheckStateRole

Лень проверять, возможно и ошибаюсь, но когда-то перепробывал и это - не работает оно для QHeaderView - не совсем это обычный класс.


Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 20, 2009, 12:23
Код:
Qt::CheckStateRole

Перед тем как писать в форум я это пробывал. У меня не получилось.
Одной роли мало, надо вернуть соответсвуюющий флаг, для ячеек получается вернуть флаг ,а вот как вернуть нужный флаг для заголовка ???


Название: Re: CheckBox в QHeaderView
Отправлено: Hordi от Ноябрь 20, 2009, 12:30
Цитировать
плохое решение, я обычно для таких целей пользуюсь патерном посетитель:
Написал один раз обход модели, передал алгоритм или выбрал алгоритм с пом. того-же выпадающего меню и опля, везде чекбоксы расставлены или еще чего. Меньше кода писать приходится.
Причем тут паттерны? Автора интересовал вопрос построения интерффейса.....
А при том, что при разрастании функционала никаких экранов не хватит, что-бы "заочевиднить" функцию.
Правильно учитесь писать программы.... моники не резиновые....

Чекбокс в колонке хидера - это абсолютно устоявшийся GUI-контрол - масса заказчиков его хотят. Я знаю, что горячая клавиша - быстрее, а меню - проще в реализации, но если клиент хочет чекбокс - склонить его в сторону меню НЕ ПОЛУЧИТСЯ!


Название: Re: CheckBox в QHeaderView
Отправлено: break от Ноябрь 20, 2009, 13:41
Цитировать
А при том, что при разрастании функционала никаких экранов не хватит, что-бы "заочевиднить" функцию.
Правильно учитесь писать программы.... моники не резиновые....

1) Учись правильно писать программы......
2) Как было объявлено выше другим человеком чекбокс - устоявшийся контрол которого хотят многие клиенты...
3) Я считаю что это действительно удобный контрол который не захламляет экран а уменьшает его захламление - ведь пункт меню. с надписью "Выделить все ячейки в колонке" или "Выделить колонку" - занимает в любом случае больше места - это менее интуитивно, и его надо еще и найти щелкнув правой кнопкой мыши туда куда надо! (на заголовок - а именно на горизонтальную его часть)

С другой стороны считаю что альтернативой может служить одинарный или двойной клик по заголовку столбца который надо выделить - это стандартное поведение для большинства электронных таблиц, которым можно успокоить даже клиентов которые хотят чекбоксы...


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 20, 2009, 15:45
Цитировать
плохое решение, я обычно для таких целей пользуюсь патерном посетитель:
Написал один раз обход модели, передал алгоритм или выбрал алгоритм с пом. того-же выпадающего меню и опля, везде чекбоксы расставлены или еще чего. Меньше кода писать приходится.
Причем тут паттерны? Автора интересовал вопрос построения интерффейса.....
А при том, что при разрастании функционала никаких экранов не хватит, что-бы "заочевиднить" функцию.
Правильно учитесь писать программы.... моники не резиновые....
Чекбокс в колонке хидера - это абсолютно устоявшийся GUI-контрол - масса заказчиков его хотят.
Покажи пару распространенных софтин где есть этот контрол.
Я его только раз видел, и то был прототип на дельфях, а эти хлопцы знатные извращенцы (ничего личного)....
ПС. в конце концов никто не запрещает сходить с ума, но это тупиковый путь - скрины не резиновые.
Там где множественные наборы данных всегда есть место и не одному алгоритму:
- Оптичить все
- Снять оптичивание;
- Инвертировать оптичивание;
- оптичить по условию....;
Для хейдеровв таблиц нормальными операциями считаю: поменять сортировку по клику и размер увеличить уменьшить, остальное извраты.



Название: Re: CheckBox в QHeaderView
Отправлено: Igors от Ноябрь 20, 2009, 15:55
...но если клиент хочет чекбокс - склонить его в сторону меню НЕ ПОЛУЧИТСЯ!
+100 за понимание психологии заказчика. Если его требования разумны (хоть как-то, не полный бред) - надо идти ему навстречу, а дебаты и препирательства ничего хорошего не приносят


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 20, 2009, 15:57
1) Учись правильно писать программы......
уже 16 лет этим занимаюсь, представление имею огромное..

2) Как было объявлено выше другим человеком чекбокс - устоявшийся контрол которого хотят многие клиенты...
я тебе много могу порасказать, что хотят клиенты и во что это потом выливается...
заказчики теперь вперед советуются, что-бы своими хотелками дров не наломать...

3) Я считаю что это действительно удобный контрол который не захламляет экран а уменьшает его захламление.
удобный спору нет, но он
1. малофункциональный
2. Неоднозначный. (однозначный только для тех кто знает какую он функцию несет).
3. Нерасширяемый (в следствие этого тупиковый).

3) Я считаю что это действительно удобный контрол который не захламляет экран а уменьшает его захламление - ведь пункт меню. с надписью "Выделить все ячейки в колонке" или "Выделить колонку" - занимает в любом случае больше места - это менее интуитивно, и его надо еще и найти щелкнув правой кнопкой мыши туда куда надо!
Дело не в экономии места, а в концепции построения интерфейса.
Вот на хабре выматерили новый интерфейс 1Сv8.2. за ненативность и прочее, хотите идти по стопам авось разберутся, ну и в добрый путь.
о понимать надо чего ты деолаешь и куда это заведет.
Сложно что-ли повесить рядом панель пиктограмм с действиями?


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 20, 2009, 16:02
...но если клиент хочет чекбокс - склонить его в сторону меню НЕ ПОЛУЧИТСЯ!
+100 за понимание психологии заказчика. Если его требования разумны (хоть как-то, не полный бред) - надо идти ему навстречу, а дебаты и препирательства ничего хорошего не приносят
и че?
-1000 за слепое удовлетворение заказчиков без оглядки на будущее.
у меня совещательный принцып работы с заказчиком:
он высказывает проблему, я ему выдаю несколько вариантов исполнения, характеризую варианты,
привожу плюсы и минусы, а потом заказчик выбирает путь решения.
особое внимание придаю прозрачности, понятности и целостности системы.
некоторые сначала принимали за истину только свои хотелки, потом сообразили, что лучше проконсультироваться.


Название: Re: CheckBox в QHeaderView
Отправлено: Igors от Ноябрь 20, 2009, 16:21
-1000 за слепое удовлетворение заказчиков без оглядки на будущее.
Мне лично этот чекбокс тоже не по душе, непонятно что он делает, первая мысль - колонка не значима? Но это всего лишь деталь UI, ничего "принципиального" здесь нет. Да, есть места/ситуации где нужно упираться рогом и говорить "нет" как бы клиент ни хотел, но чекбокс в хедере в их число не входит :)


Название: Re: CheckBox в QHeaderView
Отправлено: lit-uriy от Ноябрь 20, 2009, 16:22
нафлудили-то сколько и ничего по делу.
Дак как поместить "галку" в заголовок столбца?


Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 20, 2009, 16:31
Господа, может уже хватит    8)  На пустом месте устраиваете конфликт.
Когда очевидных способов решение задачи нет любой программер начинает упираться рогом и приводить кучу доказательств в пользу тог что этого делать нельзя - лень матушка - проще найти оправдание почему это не делать чем сделать  ;D

Помио описанных выше способов есть ещё два - более близких к тому что требуется.
1. Убрать заголовок вообще и вместо заголовка выводить строку с галочками. (например именно так реализована данная задача при просмторе писем в том же mail.ru)
2. Делать некую имитацию чекбокса через вывод картинок




Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 20, 2009, 16:37
-1000 за слепое удовлетворение заказчиков без оглядки на будущее.
Мне лично этот чекбокс тоже не по душе, непонятно что он делает, первая мысль - колонка не значима?
дык я о неоднозначности в том числе и говорил.
а "не по душе" он тебе просто потому что ты чуствуешь неправильность применения, а словами высказать что именно неправильно не получается.

Господа, может уже хватит    8)  На пустом месте устраиваете конфликт.
это не конфликт, конфликт, это когда спор по личным мотивам. а тут никто не корыстен и не уязвлен (вроде).
просто технические мотивы и принцыпы обсуждаются..
пс. согласен, от темы отклонились, но проблема многоаспектная:
например:
http://habrahabr.ru/company/turbomilk/blog/74806/


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 20, 2009, 16:45
нафлудили-то сколько и ничего по делу.Дак как поместить "галку" в заголовок столбца?
дык как нестандартное поведение делают?
наследуются и рисуют че надо.
в чем вопрос-то?


Название: Re: CheckBox в QHeaderView
Отправлено: Hordi от Ноябрь 20, 2009, 16:54
нафлудили-то сколько и ничего по делу.Дак как поместить "галку" в заголовок столбца?
дык как нестандартное поведение делают?
наследуются и рисуют че надо.
в чем вопрос-то?

Действительно... А как программа делается? Да просто, берется и пишется... :)

Мне например непонятно почему этот чекбокс Qt не реализует, тем более что всякие Role теоретически этот элемент должна добавлять, а в реале ничего не происходит... А заказчики... ну они деньги платят, и если на все твои утверждения отвечают - ХОЧУ, то надо делать. Например, для того же QHeaderView захотели по клику по колонке чтобы менялась сортировка  ВПЕРЕД-НАЗАД-НЕТ_СОРТИРОВКИ... По мне так вполне логично, но Qt это не позволяет - приходится извращаться...


Название: Re: CheckBox в QHeaderView
Отправлено: break от Ноябрь 21, 2009, 02:01
По теме: - если совсем никак не получается, то можно сделать 2 изображения иконки checkbox-са соответственно с галочкой и без и выводить их в нужной колонке заголовка - плюс соответствующим образом обрабатывать клики по этому заголовку, соответственно проходя по реальным данным!

Оффтоп для panAlexey:
Цитировать
удобный спору нет, но он
1. малофункциональный
2. Неоднозначный. (однозначный только для тех кто знает какую он функцию несет).
3. Нерасширяемый (в следствие этого тупиковый).
1) Если вы согласились что контрол удобный то философия на тему насколько удобен и расширяем бессмыслена, зачем расширять функциональность чекбокса, который и так делает то что должен?
2) На счет неоднозначности - вранье - на скрине ниже я приложил пример использования данного контрола и сомневаюсь что хоть один человек не поймет что он делает, а иконки на тулбаре по вашему сразу всем понятны а не только тем кто уже знает какие они скрывают действия?
3) Малофункциональный - вообще тарабарщина, вы ведь не сетуете что колеса на вашей машине, из-за малой ф-сти не могут посуду мыть? А у обычной кнопки большая функциональность? а у гиперссылки? Я вам даже так скажу при условии правильной организации интерфейса из этих простых контролов получается очень гибкая и многофункциональная система - например этот самый контрол позволяет в известной почтовой системе (на скрине) одновременно удалять письма в спам, переносить и т.д. да вообщем все групповые действия одним кликом, без всяких контекстных меню!

А вообще то что вы 16 лет пишете программы для меня не является авторитетным заявлением, покажите плоды своего труда - может это система с абсолютно правильным построением интерфейса? Это вам в ответ на то что вы тыкаете мол - "учитесь писать программы" --- "сам учись", я видел плоды труда программистов работавших и более длительное время и их программы для пользователей были просто гемморой и было это по причине монополии (заказчик и исполнитель были определены политически - откатами), стоит заявлять о своих подвигах подкрепляя это реальными успехами а не количеством потраченного времени!


Название: Re: CheckBox в QHeaderView
Отправлено: Sergey B. от Ноябрь 21, 2009, 09:56
О... шрифты...

Вот за что люблю OS X - так это за красивые шрифты :) (люблю изящество)


Название: Re: CheckBox в QHeaderView
Отправлено: uriel от Ноябрь 21, 2009, 10:20
Хм, так а QHeaderView же виджет. Что мешает сделать его родителем у нужного чекбокса и просто позиционировать руками?
Я что-то подобное делал, только оно было не в самом заголовке, а над ним, но разные виджеты и для каждого столбца (для фильтрации).


Название: Re: CheckBox в QHeaderView
Отправлено: Hordi от Ноябрь 21, 2009, 11:20
Хм, так а QHeaderView же виджет. Что мешает сделать его родителем у нужного чекбокса и просто позиционировать руками?
Я что-то подобное делал, только оно было не в самом заголовке, а над ним, но разные виджеты и для каждого столбца (для фильтрации).

Это можно, но имеем проблемы:
1.При переносе, ресайзе колонки нужно искать этот чекбокс и переносить (т.е. связывать чекбоксы с logicalIndex).
2.При удалении колонки удалять чекбокс
3.Что-то делать с текстом колонки, чтобы чекбокс не наезжал на него.

Это все называется - прикручивать костыли! Работать будет, но некрасиво!

Берем стандартный контрол - QTreeWidget - есть чекбоксы родителей и чайлдов. Класс сам отслеживает и выставляет в tristate-checked-unchecked родительские чекбоксы, все просто и красиво...


Название: Re: CheckBox в QHeaderView
Отправлено: uriel от Ноябрь 21, 2009, 11:58
Да, по-моему, оно в любом случае будет немного костыльностью отдавать, как его не прикручивай, если уж api не предусматривает такой возможности явно. :)
А завязываться на логический индекс всё равно придётся, разве нет? Нужно же как-то будет определять, с какой колонкой мы работаем, когда меняем состояние чекбокса.
А если уж охота делать наиболее "нативным" образом, то можно отнаследоваться от QHeaderView, добавить несколько методов в интерфейс, переопределить paintSection и через инструменты QStyle и QStyleOption отрисовать всё как надо. По-моему, вариант самый муторный, но зато наиболее общий, универсальный и выдержан в общем стиле. :)


Название: Re: CheckBox в QHeaderView
Отправлено: Hordi от Ноябрь 21, 2009, 12:23
Вот имеющаяся реализация...


Название: Re: CheckBox в QHeaderView
Отправлено: spectre71 от Ноябрь 21, 2009, 12:32
Как в заголовок (QHeaderView) помимо текста вставить CheckBox ???
Ну кпримеру в QAbstractItemModel есть возможность вставлять чекбоксы в ячейки а вот как это сделать в заголовок ???


Используй paintSection для отрисовки всего что хочешь.
Используй Мышиные события для изменения сотояний итд.
Простейший пример по отрисовке:

Код
C++ (Qt)
class MyHeader : public QHeaderView
{
 Q_OBJECT
//...
//...
//...
protected:
 virtual void paintSection ( QPainter * painter, const QRect & rect, int logicalIndex ) const;
};
 
static QPixmap drawCheckBox(QStyle* Style, QStyle::State State, const QWidget* w) {
 QStyleOptionButton StyleOptionButton;
 if(w) {StyleOptionButton.initFrom(w);}
 StyleOptionButton.state = State;
 QRect r = Style->subElementRect (QStyle::SE_CheckBoxIndicator, &StyleOptionButton);
 StyleOptionButton.rect = r;
 if(!(State&QStyle::State_Enabled)) {
   QPalette p = QApplication::palette();
   p.setColor(QPalette::Active, QPalette::Text, p.color(QPalette::Disabled, QPalette::Text));
   StyleOptionButton.palette = p;
 }
 
 QPixmap pixmap(r.width(), r.height());
 pixmap.fill(Qt::transparent);
 QPainter painter;
 painter.begin(&pixmap);
 painter.translate(-r.left(), -r.top());
 Style->drawPrimitive(QStyle::PE_IndicatorCheckBox, &StyleOptionButton, &painter);
 painter.end();
 return pixmap;
}
 
void MyHeader::paintSection ( QPainter * painter, const QRect & rect, int logicalIndex ) const {
// QHeaderView::paintSection(painter, rect, logicalIndex);
 
 QPixmap pm = drawCheckBox(QApplication::style(), QStyle::State_Active | QStyle::State_Enabled | QStyle::State_On, this);
 QRect DstRect = pm.rect();
 int woffset = rect.left() + (rect.width()-pm.rect().width())/2;
 int hoffset = rect.top() + (rect.height()-pm.rect().height())/2;
 DstRect.translate(woffset, hoffset);
 painter->drawPixmap(DstRect, pm, pm.rect());
 
}





Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 23, 2009, 12:32
Вот имеющаяся реализация...
У меня не заработала :(
Возможно из=за того что у меня вместо QTreeWidget используется QAbstractItemModel.
Разобраться что к чему в исходниках у меня пока тоже не получилось - как то мудрёно...


Название: Re: CheckBox в QHeaderView
Отправлено: lit-uriy от Ноябрь 23, 2009, 13:03
>>вместо QTreeWidget используется QAbstractItemModel.
Даже примерно не одно и тоже. Виджет наследник представления. А модель сама по себе.


Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 23, 2009, 13:18
>>вместо QTreeWidget используется QAbstractItemModel.
Даже примерно не одно и тоже. Виджет наследник представления. А модель сама по себе.
капитан очевидность  вставил свои пять копеек :) Зачем придираться к словам. В представленной реализации из виджета выдерается модель а тривиджете используется именно аьстрактмодель (как член класса) Поэтому кто мешает подсунуть можель напрямую. Но у пеня пока не получилось разобраться в исходниках представленой тут реализации чекбокосв в хедере


Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 23, 2009, 13:24
Используй paintSection для отрисовки всего что хочешь.
Используй Мышиные события для изменения сотояний итд.
Простейший пример по отрисовке:

Если уж на то пошло... Помоему проще использовать тупо три битмапки с состояниями чекбокса и подстовлять их в качесвте Qt::DecorationRole

Но все это цветочки. ЧТобы отловить клик по хедеру нужно включить соответсвующие свойство хедера, но тогда вся секция будет реагировать на нажатие со весми вытекающими. Чтобы менять состояние "чекбоксов" надо вылавливать место клика - т.е. просчитывать прямоугольник в котром отрисована иконка.
И т.п. и тд.

Конечо можно штаны надеть через голову и вручную отрисовать все GUI но тогда зачем Qt.




Название: Re: CheckBox в QHeaderView
Отправлено: spectre71 от Ноябрь 23, 2009, 14:57
Если уж на то пошло... Помоему проще использовать тупо три битмапки с состояниями чекбокса и подстовлять их в качесвте Qt::DecorationRole

Можно и так попробовать, только не 3, а как минимум 12:

Код
C++ (Qt)
QPixmap drawCheckBox(QStyle* Style, QStyle::State State, const QWidget* w) {
 QStyleOptionButton StyleOptionButton;
 if(w) {StyleOptionButton.initFrom(w);}
 StyleOptionButton.state = State;
 QRect r = Style->subElementRect (QStyle::SE_CheckBoxIndicator, &StyleOptionButton);
 StyleOptionButton.rect = r;
 if(!(State&QStyle::State_Enabled)) {
   QPalette p = QApplication::palette();
   p.setColor(QPalette::Active, QPalette::Text, p.color(QPalette::Disabled, QPalette::Text));
   StyleOptionButton.palette = p;
 }
 
 QPixmap pixmap(r.width(), r.height());
 pixmap.fill(Qt::transparent);
 QPainter painter;
 painter.begin(&pixmap);
 painter.translate(-r.left(), -r.top());
 Style->drawPrimitive(QStyle::PE_IndicatorCheckBox, &StyleOptionButton, &painter);
 painter.end();
 return pixmap;
}
 
 
QPixmap Pixmap;
Pixmap = drawCheckBox(Style, QStyle::State_Off);
Pixmap = drawCheckBox(Style, QStyle::State_On);
Pixmap = drawCheckBox(Style, QStyle::State_NoChange);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_Off );
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_On);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_NoChange);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_Off       | QStyle::State_MouseOver);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_On        | QStyle::State_MouseOver);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_NoChange  | QStyle::State_MouseOver);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_Off       | QStyle::State_MouseOver | QStyle::State_Sunken);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_On        | QStyle::State_MouseOver | QStyle::State_Sunken);
Pixmap = drawCheckBox(Style, QStyle::State_Active | QStyle::State_Enabled | QStyle::State_NoChange  | QStyle::State_MouseOver | QStyle::State_Sunken);
 

Но все это цветочки. ЧТобы отловить клик по хедеру нужно включить соответсвующие свойство хедера, но тогда вся секция будет реагировать на нажатие со весми вытекающими. Чтобы менять состояние "чекбоксов" надо вылавливать место клика - т.е. просчитывать прямоугольник в котром отрисована иконка.
И т.п. и тд.

Это не так сложно сделать.

Конечо можно штаны надеть через голову и вручную отрисовать все GUI но тогда зачем Qt.

Ну не сделали пока такой возможности для QHeaderView. И что теперь вешаться.
Пишите троллям заявку. Может сделают через полгодика. :)
А пока, если время не терпит, прийдется делать свою реализацию.


Название: Re: CheckBox в QHeaderView
Отправлено: Igors от Ноябрь 23, 2009, 16:42
Ну не сделали пока такой возможности для QHeaderView. И что теперь вешаться.
Пишите троллям заявку. Может сделают через полгодика. :)
А пока, если время не терпит, прийдется делать свою реализацию.
Писать свое - вообще-то дело полезное, но в данном конкретном случае оно получается "не в масть". Слишком много надо перехватить/переделать, это минус Qt если оно не позволяет делать это просто/легко. Поэтому имеет смысл писать "телегу" (то есть коллективную заявку). Примерно так

Цитировать
Hello Qt

We would really like to have an ability to equip QTreeWidgetItem with user-defined widgets. The necessity to put some controls into table headers happens often and have been asked by our clients many times. Although now we can fake up it with DecorateRole it requires a lot of extra code/efforts. With Qt support it would be a really usable feature.

Thank you

<signatures list> 
Ну и подписей хотя бы десятка два. Это может прокатить.


Название: Re: CheckBox в QHeaderView
Отправлено: spectre71 от Ноябрь 23, 2009, 16:54
Ну не сделали пока такой возможности для QHeaderView. И что теперь вешаться.
Пишите троллям заявку. Может сделают через полгодика. :)
А пока, если время не терпит, прийдется делать свою реализацию.
Писать свое - вообще-то дело полезное, но в данном конкретном случае оно получается "не в масть". Слишком много надо перехватить/переделать, это минус Qt если оно не позволяет делать это просто/легко. Поэтому имеет смысл писать "телегу" (то есть коллективную заявку). Примерно так

Цитировать
Hello Qt

We would really like to have an ability to equip QTreeWidgetItem with user-defined widgets. The necessity to put some controls into table headers happens often and have been asked by our clients many times. Although now we can fake up it with DecorateRole it requires a lot of extra code/efforts. With Qt support it would be a really usable feature.

Thank you

<signatures list> 
Ну и подписей хотя бы десятка два. Это может прокатить.

- Ну на мой взгляд в QT в Model/View слишком много "не в масть". :)
- По поводу "Слишком много надо перехватить/переделать" - я так не считаю, работы максимум на день.



Название: Re: CheckBox в QHeaderView
Отправлено: Igors от Ноябрь 23, 2009, 17:20
- По поводу "Слишком много надо перехватить/переделать" - я так не считаю, работы максимум на день.
А день тратить на такую фигню не жалко? Да и день - это до первой рабочей версии - а там еще рихтовать. Если мы обещали "помочь сделать Qt лучше", то это хорошая возможность отметиться вместо того чтобы показывать свою "крутизну" :) 


Название: Re: CheckBox в QHeaderView
Отправлено: spectre71 от Ноябрь 23, 2009, 17:33
- По поводу "Слишком много надо перехватить/переделать" - я так не считаю, работы максимум на день.
А день тратить на такую фигню не жалко? Да и день - это до первой рабочей версии - а там еще рихтовать. Если мы обещали "помочь сделать Qt лучше", то это хорошая возможность отметиться вместо того чтобы показывать свою "крутизну" :) 

1) Я уже один раз писал троллям, так мне кроме робота никто не ответил. Хотите писать - пишите.
2) Ждать не известно сколько пока кто-то сделает - это не выход, особенно когда функциональность нужна сейчас.


Название: Re: CheckBox в QHeaderView
Отправлено: Igors от Ноябрь 23, 2009, 18:06
1) Я уже один раз писал троллям, так мне кроме робота никто не ответил. Хотите писать - пишите.
2) Ждать не известно сколько пока кто-то сделает - это не выход, особенно когда функциональность нужна сейчас.
Я тоже писал (про отот realloc). Сначала тоже робот. А потом товарищ Thomassen ответил, сказал спасибо и поместил в баг тракинг. Но то баг, а с features request дело хужее. Если 1 человек напишет, то скорее всего отмахнутся, просто потому что каждый пользователь много чего хочет. А вот на коллективную телегу - скорее всего среагируют. Пусть через полгода сделают - не всю жизнь на это время тратить.


Название: Re: CheckBox в QHeaderView
Отправлено: spbtellurian от Ноябрь 24, 2009, 19:38
Поэтому имеет смысл писать "телегу" (то есть коллективную заявку). Примерно так
Цитировать
Hello Qt

We would really like to have an ability to equip QTreeWidgetItem with user-defined widgets. The necessity to put some controls into table headers happens often and have been asked by our clients many times. Although now we can fake up it with DecorateRole it requires a lot of extra code/efforts. With Qt support it would be a really usable feature.

Thank you

<signatures list> 
Ну и подписей хотя бы десятка два. Это может прокатить.
Подписываюсь!  :)


Название: Re: CheckBox в QHeaderView
Отправлено: spectre71 от Ноябрь 24, 2009, 21:24
Поэтому имеет смысл писать "телегу" (то есть коллективную заявку). Примерно так
Цитировать
Hello Qt

We would really like to have an ability to equip QTreeWidgetItem with user-defined widgets. The necessity to put some controls into table headers happens often and have been asked by our clients many times. Although now we can fake up it with DecorateRole it requires a lot of extra code/efforts. With Qt support it would be a really usable feature.

Thank you

<signatures list> 
Ну и подписей хотя бы десятка два. Это может прокатить.
Подписываюсь!  :)

Какое отношение QTreeWidgetItem имеет к заголовкам таблиц, да никакого.
И вообще QTreeWidgetItem не имеет прямого отношения к ролям!
Сначала надо разобраться что и как, что хотим, а потом уже составлять заявку.

Вот где собака зарыта:
virtual QVariant QAbstractItemModel::headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const
И в том что QHeaderView - наследник QAbstractItemView.


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 25, 2009, 00:13
Дык сразу не забудьте и иерархический заголовок заказать и футтеры.


Название: Re: CheckBox в QHeaderView
Отправлено: break от Ноябрь 25, 2009, 03:11
Цитировать
Дык сразу не забудьте и иерархический заголовок заказать и футтеры.
Согласен - это тоже нужное дело! Если в баг трекер добавите - киньте в личку ссылку на issue - проголосую!


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Ноябрь 25, 2009, 15:50
Цитировать
Дык сразу не забудьте и иерархический заголовок заказать и футтеры.
Согласен - это тоже нужное дело! Если в баг трекер добавите - киньте в личку ссылку на issue - проголосую!
Я лучше сам напишу: мне оно нужно в недалеком будующем...
Да и есть с чего слизывать %)


Название: Re: CheckBox в QHeaderView
Отправлено: Senia_Bezrubashkin от Февраль 06, 2013, 14:11
И как теперь обстоит дело? Изменилось, что-нибудь? Появился стандартный инструмент или все же придется сочинять самому?


Название: Re: CheckBox в QHeaderView
Отправлено: panAlexey от Февраль 06, 2013, 22:38
можешь привести задачу, где это необходимо? чета как не напрягался не смог придумать...
Странно т.к. задачка встречается повсеместно. Групповые операции.

Ну скажем есть у тебя таблица во всех ячках одной из колонок есть чекбоксы. Весьма распространенная ситуация. А теперь представим что надо все чекбоксы установить\снять. Когда строк в таблице (читай чекбоксов) две-три ну наверно можно три раза кликнуть мышкой а когда строк с несколько десятков.
Конечно можно тупо и упорно кликать по всем чекбоксам но гораздо быстрее и удобнее кликнуть один раз в заголовке.

Есть альтернатива – менее очевидная и менее удобная – вместо одного действия (клик в заголовке) делать два действия – выбор всей колонки и клик по любому из чекбоксов в колонке. Но это гораздо менее красивое и менее очевидное решение.
Обхожусь 3-мя кнопками [v|v] [o|o] [o|v]. Это мой стандартный набор для таких операций. Выглядят они по другому, но смысл понятен и картинку лень вставлять.