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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget выделить элемент рамкой  (Прочитано 3542 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Январь 23, 2015, 10:27 »

Как в QTreeWidget выделить одной рамкой "активный" элемент (2 колонки)? Активный элемент выбирается двойным кликом мышки или нажатием enter/space.

Можно ли сделать через делегат или так пойдет?
Код:
void TreeWidgetList::paintEvent(QPaintEvent *event)
{
    QTreeWidget::paintEvent(event);

    if(activeItem!=-1) {
        QPainter p(viewport());
        p.setPen(Qt::red /*Qt::darkGreen*/);
        p.drawRect(visualItemRect(topLevelItem(activeItem)).adjusted(1,1,-1,-1));
    }
}

Если выбрать новый элемент старые рамки остаются(ручками repaint запускать надо)
« Последнее редактирование: Январь 23, 2015, 11:33 от deMax » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Январь 23, 2015, 10:49 »

Как насчёт void QTreeView::setAllColumnsShowFocus(bool enable)?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Январь 23, 2015, 10:49 »

ИМХО, лучше делегатом сделать, если нужно не все колонки выделять.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #3 : Январь 23, 2015, 11:14 »

Да нет у меня это по сути список, просто с колонками.

Не могу repaint победить, со старых элементов не стираются рамки. Только свернуть/развернуть работает.

Код:
    if(item<topLevelItemCount()) {
        QRect rect(visualItemRect(topLevelItem(activeItem)));
        activeItem = -1;
        repaint(rect); <--- должен перерисовать старую область
        setCurrentItem(topLevelItem(activeItem = item));
        repaint(visualItemRect(topLevelItem(activeItem)));
    }

Даже просто вызов repaint() не затирает рамки
« Последнее редактирование: Январь 23, 2015, 11:41 от deMax » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Январь 23, 2015, 12:48 »

Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #5 : Январь 23, 2015, 14:07 »

Спасибо, так смотрится лучше.
repaint не победил(даже если исправить, как то некрасиво эта рамочка выглядит). Сделал выделение жирным.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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