crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Disable frame focus rect
DEADHUNT
  опции профиля:
сообщение 15.11.2009, 16:11
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


кто нибудь знает как можно отключить прорисовку прямоугольника при получении фокуса?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.11.2009, 16:23
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(DEADHUNT @ 15.11.2009, 19:11) *
прорисовку прямоугольника при получении фокуса?
это связано с конкретным стилем и любым виджетом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.11.2009, 16:58
Сообщение #3


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

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

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




Репутация:   34  


Я пока знаю только 2 варианта и оба с недостатками.

Первый это вызвать QWidget::setFocusPolicy(Qt::NoFocus), недостаток в том, что кнопку теперь кроме как мышкой больше никак не нажать и фокуса у такой кнопки вообще нет.

Второй вариант это использовать прокси для стиля и переопределить в своем стиле метод QStyle::drawPrimitive(), если метод получает в качестве параметра PE_FrameFocusRect, то игнорить. Главное тут стиль установить только для нужных виджетов, а не для всего приложения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 15.11.2009, 17:22
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


Цитата(SABROG @ 15.11.2009, 16:58) *
Второй вариант это использовать прокси для стиля и переопределить в своем стиле метод QStyle::drawPrimitive(), если метод получает в качестве параметра PE_FrameFocusRect, то игнорить. Главное тут стиль установить только для нужных виджетов, а не для всего приложения.

хотел сделать что-то типа второго(переопределить drawPrimitive и игнорировать PE_FrameFocusRect, только не понял как сделать), SABROG спасибо за пример.

Цитата(SABROG @ 15.11.2009, 16:58) *
Я пока знаю только 2 варианта и оба с недостатками.

а в чём недостаток второго?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 15.11.2009, 18:06
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


вот так получилось решить:

Раскрывающийся текст
class ProxyStyle : public QStyle
{
    private:
        QStyle *m_style;

    protected:
        const QStyle *style() const
        {
            return m_style;
        }

        virtual void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const
        {
            m_style->drawComplexControl(control, option, painter, widget);
        }

        virtual void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const
        {
            m_style->drawControl(element, option, painter, widget);
        }

        virtual void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const
        {
            m_style->drawPrimitive(element, option, painter, widget);
        }

        virtual QPixmap generatedIconPixmap (QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *option) const
        {
            return m_style->generatedIconPixmap(iconMode, pixmap, option);
        }

        virtual SubControl hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option, const QPoint &position, const QWidget *widget = 0) const
        {
            return m_style->hitTestComplexControl(control, option, position, widget);
        }

        virtual int pixelMetric(PixelMetric metric, const QStyleOption *option = 0, const QWidget * widget = 0) const
        {
            return m_style->pixelMetric(metric, option, widget);
        }

        virtual QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const
        {
            return m_style->sizeFromContents(type, option, contentsSize, widget);
        }

        virtual int styleHint(StyleHint hint, const QStyleOption *option = 0, const QWidget *widget = 0, QStyleHintReturn *returnData = 0) const
        {
            return m_style->styleHint(hint, option, widget, returnData);
        }

        virtual QRect subControlRect(ComplexControl control, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget = 0) const
        {
            return m_style->subControlRect(control, option, subControl, widget);
        }

        virtual QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget = 0) const
        {
            return m_style->subElementRect(element, option, widget);
        }

        virtual QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *option = 0, const QWidget *widget = 0) const
        {
            return m_style->standardPixmap(standardPixmap, option, widget);
        }

    public:
        ProxyStyle(QWidget *widget) : QStyle()
        {
            m_style = QStyleFactory::create(widget->style()->objectName());
        }
};

class NoFocusStyle : public ProxyStyle {
    protected:
        void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const
        {
            if (element != QStyle::PE_FrameFocusRect)
                style()->drawPrimitive(element, option, painter, widget);
        }
    public:
        NoFocusStyle(QWidget *widget) : ProxyStyle(widget)
        {
        }
};

Причина редактирования: вместо тэга spoiler используй expand
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.11.2009, 18:14
Сообщение #6


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

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

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




Репутация:   34  


Цитата(DEADHUNT @ 15.11.2009, 17:22) *
а в чём недостаток второго?


В сложности решения. Кстати переопределять кучу других методов не обязательно, если ты не собираешься в них что-то менять.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 15.11.2009, 18:23
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


Цитата(SABROG @ 15.11.2009, 18:14) *
В сложности решения. Кстати переопределять кучу других методов не обязательно, если ты не собираешься в них что-то менять.

почему необязательно? они же чисто виртуальные в QStyle.

Сообщение отредактировал DEADHUNT - 15.11.2009, 18:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.11.2009, 18:23
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(SABROG @ 15.11.2009, 21:14) *
Кстати переопределять кучу других методов не обязательно,
только что хотел тоже самое написать. (Т.к. они наследуются)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 15.11.2009, 18:25
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


Цитата(Litkevich Yuriy @ 15.11.2009, 18:23) *
только что хотел тоже самое написать. (Т.к. они наследуются)

откуда они наследуются? в QStyle они не реализованы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.11.2009, 18:26
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


DEADHUNT, да ты прав. Я почему-то думал, что можно создавать экземпляры QStyle.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.4.2024, 19:12