crossplatform.ru

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

panter_dsd
  опции профиля:
сообщение 14.4.2009, 16:39
Сообщение #1


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Как задать свой цвет для курсора? Отнаследовался от QTreeVew и переопределяю:

void  QFullView::drawRow ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
    QTreeView::drawRow(painter,option,index);
 if(index.row()==currentIndex().row())
{
    painter->setPen(Qt::green);
    painter->drawRect(option.rect);
}
}


Но линия рисуется только слева и сверху от итема. После дня мозго....ва мучений понял, что за вид курсора отвечает стиль, и через палитру или стайлшит ничего не поменять. Как его все таки сделать нужным мне цветом?

Сообщение отредактировал panter_dsd - 14.4.2009, 16:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 19)
igor_bogomolov
  опции профиля:
сообщение 14.4.2009, 16:59
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Под курсором подразумевается пунктирная рамка вокруг итема? Если да, то помню что я случайно менял (в том смысле, что специально я этого не добивался) через QStyleOptionViewItem->palette. Какой именно атрибут - непомню, но если все переберете, найдете.

А то что painter->drawRect(option.rect) не полнстью рисуется, так попробуйте для option.rect сместить его нижнию-правую точку на один пиксел. Должно помоч.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 14.4.2009, 17:51
Сообщение #3


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


1. А можешь точнее вспомнить?
2. Сместил, не получается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.4.2009, 18:08
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


На память не могу. Сейчас у себя попробую, чуть позже отпишусь :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 14.4.2009, 19:19
Сообщение #5


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Проблема решена.

void QFullView::drawRow ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
    QTreeView::drawRow(painter,option,index);
    if (index.row()==currentIndex().row())
    {
        QRect rect=option.rect;
        rect.setHeight(rect.height()-1);
        rect.setWidth(rect.width()-1);
        painter->setPen(Qt::green);
        painter->drawRect(rect);
    }
}


Сообщение отредактировал panter_dsd - 14.4.2009, 19:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.4.2009, 21:11
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Это самое простое решение - отрисовать рамку через drawRect.

Я ради интереса (подсмотрев в исходниках), изваял следущее
    QStyleOptionFocusRect o;
    o.rect = option.rect.adjusted(1,1,-1,-1);
    o.state |= QStyle::State_KeyboardFocusChange;
    o.state |= QStyle::State_Item;
    o.backgroundColor = QColor(0,255,255); //red
    QApplication::style()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, painter);


Тоже помоему неплохо :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 15.4.2009, 6:20
Сообщение #7


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Тоже интересно. Вот только цвет почему-то нельзя задавать так QColor(Qt::green), рисуется не зеленая рамка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.4.2009, 8:50
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(panter_dsd @ 15.4.2009, 7:20) *
Тоже интересно. Вот только цвет почему-то нельзя задавать так QColor(Qt::green), рисуется не зеленая рамка.

А если так попробовать?

o.palette.setColor(QPalette::Active, QPalette::WindowText, QColor(Qt::green));


Сообщение отредактировал SABROG - 15.4.2009, 8:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.4.2009, 9:01
Сообщение #9


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(SABROG @ 15.4.2009, 9:50) *
А если цвет QPen'a поменять у painter'a?
Никак не влияет.

Цитата(panter_dsd @ 15.4.2009, 7:20) *
Тоже интересно. Вот только цвет почему-то нельзя задавать так QColor(Qt::green), рисуется не зеленая рамка.
У меня такое впечатление что цвет там задается следущим образом QColor ( int h, int s, int v), т.е. передавать в HSV. По крайней мере QColor(0,255,255) рисует красным. Другие цвета не проверял.
--------------
Проверил двугие цвета. Не получается цвет так задать. Непонятным образом цвет искажается???

Сообщение отредактировал igor_bogomolov - 15.4.2009, 10:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 15.4.2009, 11:31
Сообщение #10


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

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Скорее всего цвет подбирается контрастом к другому цвету.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.4.2009, 12:44
Сообщение #11


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Продублирую из prog.org

Для Windows style, в исходниках цвет преобразуется следущим образом
QColor patternCol((bg_col.red() ^ 0xff) & 0xff,
            (bg_col.green() ^ 0xff) & 0xff,
            (bg_col.blue() ^ 0xff) & 0xff);


Поэтому чтобы отображался требуемый цвет, нужно его таким же образом преобразовать обратно
           QColor color = Qt::red;
           QColor newcolor((color.red() ^ 0xff) & 0xff,
              (color.green() ^ 0xff) & 0xff,
              (color.blue() ^ 0xff) & 0xff);

Отрисовку "курсора" сделал так
Раскрывающийся текст
    if ((option.state & QStyle::State_HasFocus)) {
        QColor color = Qt::red;
        QColor newcolor((color.red() ^ 0xff) & 0xff,
          (color.green() ^ 0xff) & 0xff,
          (color.blue() ^ 0xff) & 0xff);

        QStyleOptionFocusRect o;
        o.rect = option.rect.adjusted(1,1,-1,-1);
        o.QStyleOption::operator=(option);
        o.state |= QStyle::State_KeyboardFocusChange;
        o.state |= QStyle::State_Item;
        o.backgroundColor = newcolor;
        QApplication::style()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, painter);    
}



Другие стили не смотрел :)

Сообщение отредактировал igor_bogomolov - 15.4.2009, 13:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.4.2009, 13:56
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я посмотрел другие стили, там нет такого. Т.ч. логично будет использовать это:

#if defined(Q_WS_WIN)
...
#endif

---

Пардон, тут надо текущий стиль проверять, а не ОС, меня что-то переклинило.

Сообщение отредактировал SABROG - 15.4.2009, 14:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.4.2009, 14:56
Сообщение #13


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


SABROG, если только запускать с родным стилем. А если под виндой запускать c Motif или CDE стилем, опять получим проблемы с цветом.
Поэтому проверку нужно делать только на QWindowsStyle.

--------------------------
Добавлено
--------------------------
Сейчас попробовал тем же макаром изменить цвет курсора в Motif или CDE стиле. Ничего не вышло. Видимо как-то подругому там все отрисовывается.
Копаться дальше лень.

Сообщение отредактировал igor_bogomolov - 15.4.2009, 15:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.4.2009, 19:03
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Конечно можно так проверять, но это в некоторой степени не правильно:

    QColor color = Qt::red;
    QString stylename = qApp->style()->objectName().toLower();
    if (stylename == QLatin1String("windows") || stylename == QLatin1String("windowsmobile"))
    {
        QRgb rgb = color.rgb();
        rgb = (rgb & 0xff00ffff) | (((qRed(rgb) ^ 0xff) & 0xff) << 16);
        rgb = (rgb & 0xffff00ff) | (((qGreen(rgb) ^ 0xff) & 0xff) << 8);
        rgb = (rgb & 0xffffff00) | ((qBlue(rgb) ^ 0xff) & 0xff);
        color.setRgb(rgb);
    }
    ...
    o.backgroundColor = color;


Сообщение отредактировал SABROG - 15.4.2009, 19:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.4.2009, 20:11
Сообщение #15


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


SABROG, это все понятно. Можно просто проверить унаследован ли QApplication::style() от QWindowsStyle.

Дело в том, что стили Motif и CDE отрисовываются каким-то другим способом. В исходники я не лазил, но установка свойства o.backgroundColor в другой цвет ни к чему не приводит. Рамка всегда остается черной и стиль линии сплошной.
Т.е. таким путем добиться универсального решения через drawPrimitive(QStyle::PE_FrameFocusRect, &o, painter) не получается. Проще всего, на самом деле, отрисовать рамку через drawRect, как panter_dsd и сделал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.4.2009, 20:32
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(igor_bogomolov @ 15.4.2009, 21:11) *
Можно просто проверить унаследован ли QApplication::style() от QWindowsStyle.


Так чтоль?

    if(qApp->style()->inherits("QWindowsStyle"))
    {
    ...
    }


В принципе так можно:

    QWindowsStyle *st = qobject_cast<QWindowsStyle *>(qApp->style());


Но проблема в том, что указатель будет валидным для всех стилей на базе QWindowsStyle. Т.е. конкретно этот класс хрен локализуешь.
Я посмотрел исходники стилей CDE и Motif. Выяснил, что CDE базируется на стиле Motif и использует его средства для отрисовки примитивов, в то время как сам Motif использует QCommonStyle. А внути этого стиля работает такая логика, если цвет в background валидный (isValid), то выбирается один из двух цветов - черный или белый, если же цвет не валидный, то используется цвет из o.palette.foreground().color() уже без изминений. Стало быть повлиять на него можно через паллитру, но при этом цвет в background надо сделать инвалидным каким-то макаром.

Сообщение отредактировал SABROG - 15.4.2009, 21:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.4.2009, 23:08
Сообщение #17


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


2 SABROG
Цитата(SABROG @ 15.4.2009, 21:32) *
if(qApp->style()->inherits("QWindowsStyle"))
Именно так.

Цитата(SABROG @ 15.4.2009, 21:32) *
Но проблема в том, что указатель будет валидным для всех стилей на базе QWindowsStyle.
Так именно это и нужно. Все стили наследущие QWindowsStyle

QCleanlooksStyle
QPlastiqueStyle
QWindowsCEStyle
QWindowsVistaStyle
QWindowsXPStyle
QWindowsMobileStyle

используют один и тот же способ отрисовки примитива PE_FrameFocusRect. Собственно в QWindowsStyle он и определен, а остальные стили его не меняют.
Т.о. qApp->style()->inherits("QWindowsStyle") идеально подходит, и отображение для всех выше перечисленных стилей будет выглядеть одинаково.

Для стилей винды вроде разобрались. Для стилей происходящих от QCommonStyle, я так понимаю, ничего изменить не получится. Кстати, тогда на самом деле получается, что лучше использовать
#if defined(Q_WS_WIN)
...
#endif


Сообщение отредактировал igor_bogomolov - 15.4.2009, 23:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 16.4.2009, 14:20
Сообщение #18


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(SABROG @ 15.4.2009, 21:32) *
цвет в background надо сделать инвалидным каким-то макаром

Инвалидным цвет можно сделать так
QColor color(512,512,512);
:D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 16.4.2009, 14:59
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


512 - превышает размеры байта :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 16.4.2009, 15:04
Сообщение #20


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(SABROG @ 16.4.2009, 15:59) *
512 - превышает размеры байта


Ага, в конструктор передаются инты. Но если передать больше 255, QColor станет инвалидным.
Цитата
QColor ( int r, int g, int b, int a = 255 )


А ты что имел в виду?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 21.6.2025, 19:51