Russian Qt Forum
Сентябрь 30, 2024, 16:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: CheckBox в QHeaderView  (Прочитано 39637 раз)
uriel
Гость
« Ответ #30 : Ноябрь 21, 2009, 11:58 »

Да, по-моему, оно в любом случае будет немного костыльностью отдавать, как его не прикручивай, если уж api не предусматривает такой возможности явно. Улыбающийся
А завязываться на логический индекс всё равно придётся, разве нет? Нужно же как-то будет определять, с какой колонкой мы работаем, когда меняем состояние чекбокса.
А если уж охота делать наиболее "нативным" образом, то можно отнаследоваться от QHeaderView, добавить несколько методов в интерфейс, переопределить paintSection и через инструменты QStyle и QStyleOption отрисовать всё как надо. По-моему, вариант самый муторный, но зато наиболее общий, универсальный и выдержан в общем стиле. Улыбающийся
Записан
Hordi
Гость
« Ответ #31 : Ноябрь 21, 2009, 12:23 »

Вот имеющаяся реализация...
Записан
spectre71
Гость
« Ответ #32 : Ноябрь 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());
 
}



Записан
spbtellurian
Гость
« Ответ #33 : Ноябрь 23, 2009, 12:32 »

Вот имеющаяся реализация...
У меня не заработала Грустный
Возможно из=за того что у меня вместо QTreeWidget используется QAbstractItemModel.
Разобраться что к чему в исходниках у меня пока тоже не получилось - как то мудрёно...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #34 : Ноябрь 23, 2009, 13:03 »

>>вместо QTreeWidget используется QAbstractItemModel.
Даже примерно не одно и тоже. Виджет наследник представления. А модель сама по себе.
Записан

Юра.
spbtellurian
Гость
« Ответ #35 : Ноябрь 23, 2009, 13:18 »

>>вместо QTreeWidget используется QAbstractItemModel.
Даже примерно не одно и тоже. Виджет наследник представления. А модель сама по себе.
капитан очевидность  вставил свои пять копеек Улыбающийся Зачем придираться к словам. В представленной реализации из виджета выдерается модель а тривиджете используется именно аьстрактмодель (как член класса) Поэтому кто мешает подсунуть можель напрямую. Но у пеня пока не получилось разобраться в исходниках представленой тут реализации чекбокосв в хедере
« Последнее редактирование: Ноябрь 23, 2009, 13:23 от spbtellurian » Записан
spbtellurian
Гость
« Ответ #36 : Ноябрь 23, 2009, 13:24 »

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

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

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

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


Записан
spectre71
Гость
« Ответ #37 : Ноябрь 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. И что теперь вешаться.
Пишите троллям заявку. Может сделают через полгодика. Улыбающийся
А пока, если время не терпит, прийдется делать свою реализацию.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Ноябрь 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> 
Ну и подписей хотя бы десятка два. Это может прокатить.
Записан
spectre71
Гость
« Ответ #39 : Ноябрь 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 слишком много "не в масть". Улыбающийся
- По поводу "Слишком много надо перехватить/переделать" - я так не считаю, работы максимум на день.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Ноябрь 23, 2009, 17:20 »

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

- По поводу "Слишком много надо перехватить/переделать" - я так не считаю, работы максимум на день.
А день тратить на такую фигню не жалко? Да и день - это до первой рабочей версии - а там еще рихтовать. Если мы обещали "помочь сделать Qt лучше", то это хорошая возможность отметиться вместо того чтобы показывать свою "крутизну" Улыбающийся 

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

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Ноябрь 23, 2009, 18:06 »

1) Я уже один раз писал троллям, так мне кроме робота никто не ответил. Хотите писать - пишите.
2) Ждать не известно сколько пока кто-то сделает - это не выход, особенно когда функциональность нужна сейчас.
Я тоже писал (про отот realloc). Сначала тоже робот. А потом товарищ Thomassen ответил, сказал спасибо и поместил в баг тракинг. Но то баг, а с features request дело хужее. Если 1 человек напишет, то скорее всего отмахнутся, просто потому что каждый пользователь много чего хочет. А вот на коллективную телегу - скорее всего среагируют. Пусть через полгода сделают - не всю жизнь на это время тратить.
Записан
spbtellurian
Гость
« Ответ #43 : Ноябрь 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> 
Ну и подписей хотя бы десятка два. Это может прокатить.
Подписываюсь!  Улыбающийся
Записан
spectre71
Гость
« Ответ #44 : Ноябрь 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.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.316 секунд. Запросов: 23.