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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableWidget, замена индикаторов CheckBox + убирание пунктирной рамки  (Прочитано 5944 раз)
km13
Гость
« : Апрель 06, 2011, 13:31 »

Доброго времени суток.
Проблема в принципе изъезжена, но долго копался сам перед тем как задать вопрос.
Значит имеем QTableWidget и несколько колонок (не важно сколько). В двух (или более)  колонках CheckBox'ы.

Надо:
1. Заменить индикаторы CheckBox'ов на свои.
2. Убрать рамку пунктирную при выделении.
3. В разных колонках должны быть разные индикаторы (на каждую колонку необходимо настроить свой индикатор).

Решения:
1. Индикатор CheckBox'а в QTableWidget меняется в CSS:
Код:
QTableWidget::indicator:checked
{
     image: url(:/SubControls/checkbox_checked.png);
}
QTableWidget::indicator:unchecked
{
     image: url(:/SubControls/checkbox_unchecked.png);
}
Результат: Это решает только часть проблемы, так как во всех колонках индикаторы одинаковые, что не совсем подходит.

2. Дальше следую инструкции:http://developer.qt.nokia.com/faq/answer/how_can_i_remove_the_dotted_rectangle_from_the_cell_that_has_focus_in_my_qt
После setItemDelegate()
Результат: Рамка убирается, но вместе с ней пропадают замененные индикаторы, и отображаются стандартные.

3. Касательно третьего вопроса, вообще не знаю в какую сторону копать. Тем более, что видимо необходим другой способ решения либо первой проблемы либо второй, так как совместно оба решения ведут себя не так как необходимо.

Повторюсь, я потратил не мало времени в поисках решения этих проблем в совокупности (по отдельности проблемы решаются и примеров достаточно).
Спасибо за советы.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #1 : Август 29, 2011, 14:48 »

А есть еще решения на 2 вопрос?
Записан

Qt 5.11.0, Win, MinGW
Pretorean
Гость
« Ответ #2 : Август 30, 2011, 15:08 »

Код:
void CCheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
{
    if (index.column() > 0 && index.isValid() && !index.data().isNull())
    {
        bool value = index.data().toBool();
        QStyleOptionButton buttonOption;
        buttonOption.rect = option.rect;
        if (value)
            buttonOption.state = QStyle::State_On | QStyle::State_Enabled;
        else
            buttonOption.state = QStyle::State_Off | QStyle::State_Enabled;

        QApplication::style()->drawControl(QStyle::CE_CheckBox,
                                           &buttonOption, painter);
    } else
        QItemDelegate::paint(painter, option, index);
}
« Последнее редактирование: Август 30, 2011, 15:11 от Pretorean » Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #3 : Декабрь 16, 2011, 09:04 »

Цитировать
2. Убрать рамку пунктирную при выделении.
Код:
void paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
            QStyleOptionViewItemV4 opt = option;
            initStyleOption(&opt, index);
            opt.state &= ~QStyle::State_HasFocus;
            QStyledItemDelegate::paint(painter, opt, index);
        }
« Последнее редактирование: Декабрь 16, 2011, 10:43 от kolob » Записан

Qt 5.11.0, Win, MinGW
lighting
Гость
« Ответ #4 : Декабрь 16, 2011, 10:06 »

2. setFocusPolicy(Qt::NoFocus); если не использовать клавиатуру для установки чекбокса то вполне себе решение.
3. Сделать сабклассы для каждого типа чекбоксов и им уже назначить StyleSeet
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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