Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ysfox от Декабрь 10, 2010, 10:47



Название: CheckBox и RadioButton - штриховое выделение
Отправлено: ysfox от Декабрь 10, 2010, 10:47
Добрый день
Господа программисты помогите вот с такой проблемой: когда создать пользовательский интерфейс при нажатиях на клавишу или на чекбокс, или на радиобаттон - вокруг них появляется штриховая рамка... выглядит не очень(... как можно ёё убрать?
Ну с кнопками понятно, там все просто - в стиле ставишь:
Код:
setStyleSheet(" padding: -15px;");
и не паришься. А вот как быть с чекбоксами и радиобатонами? у них єто свойство не работает... Может у кого то возникала подобная проблема.


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: _govorilka от Декабрь 10, 2010, 11:19
Почитай про класс QStyle и унаследованные от него.


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: andrewshkovskii от Декабрь 10, 2010, 11:26
Скриншот рамки покажи, а то что-то я не понял : )


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: ysfox от Декабрь 10, 2010, 11:36
(http://i059.radikal.ru/1012/c4/105ee8f7cb16.png)
Вот выделена надпись "UST_B ", тоже самое и с радиобатонами... (он выделяется когда на него нажать - выделяется сам текст, а мне этого не надо, надо чтоб просто изменилась картинка и все)
лечится это просто - просто пишеш текст около них в лабеле и все... но блин зачем же тогда возможности самих виджетов, если вот таким варварским способом надо будет все переделывать(


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: andrewshkovskii от Декабрь 10, 2010, 12:18
Это InputFocus, убрать можно через css с помощь соответствующего псевдосостояния.


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: SABROG от Декабрь 10, 2010, 12:46
Это решается воздействием на стиль. Нужно запретить стилю рисовать пунктирное выделение для определенных контролов, если они имеют фокус. Для этих целей можно использовать QProxyStyle:

Код
C++ (Qt)
#ifndef PROXYSTYLE_H
#define PROXYSTYLE_H
 
#include <QtGui/QProxyStyle>
 
class ProxyStyle : public QProxyStyle
{
public:
   virtual void drawControl(ControlElement element
                            , const QStyleOption* option
                            , QPainter* painter
                            , const QWidget* widget = 0 ) const;
};
 
#endif // PROXYSTYLE_H
 
 

Код
C++ (Qt)
#include <QtGui/QStyleOptionButton>
 
#include "proxystyle.h"
 
void ProxyStyle::drawControl(ControlElement element
                            , const QStyleOption* option
                            , QPainter* painter
                            , const QWidget* widget) const
{
   switch(element) {
   case CE_CheckBox:
   case CE_RadioButton:
   case CE_PushButton: {
           QStyleOptionButton btn(
                   *qstyleoption_cast<const QStyleOptionButton*>(option));
           if (btn.state & State_HasFocus)
               btn.state = btn.state ^ State_HasFocus;
           QProxyStyle::drawControl(element, &btn, painter, widget);
           break;
       }
   default:
           QProxyStyle::drawControl(element, option, painter, widget);
   }
}
 
 

Можно использовать так:

Код
C++ (Qt)
#include "proxystyle.h"
...
   ui->pushButton->setStyle(new ProxyStyle);
   ui->checkBox->setStyle(new ProxyStyle);
   ui->radioButton->setStyle(new ProxyStyle);
 

или так, для глобального переопределения:

Код
C++ (Qt)
QApplication::setStyle(new ProxyStyle);
 

Есть еще такой вариант
Код
C++ (Qt)
ui->radioButton->setFocusPolicy(Qt::NoFocus);
 
Но у него есть свои подводные камни.


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: ysfox от Декабрь 10, 2010, 12:56
Это InputFocus, убрать можно через css с помощь соответствующего псевдосостояния.

щас попробую поискать, как его изменить...
спасибо!


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: ysfox от Декабрь 10, 2010, 13:06
Вот так работает идеально:
Код:
ui->radioButton_CN_EXT->setFocusPolicy(Qt::NoFocus);
но это локальный вариант - только для какогото конкретного елемента. а вот глобально пробовал сделать - применить ко всей форме:
Код:
 ACTS12K::setFocusPolicy(Qt::NoFocus);
так почемуто ничего не выходит... хотя это можно понять - снимается только фокус с вормы а не виджетов на ней...

Щас попробую еще вариант SABROG
Спасибо


вот только было б меньше проблем просто както применить выше упомянутую функцыю ко всем виджетам на форме.... но как это зделать пока незнаю.


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: ysfox от Декабрь 10, 2010, 15:26
или так, для глобального переопределения:
Код
C++ (Qt)
QApplication::setStyle(new ProxyStyle);
 

Есть еще такой вариант
Код
C++ (Qt)
ui->radioButton->setFocusPolicy(Qt::NoFocus);
 
Но у него есть свои подводные камни.

если делаю глобально програма просто вылетает, а так работает но ничего не изменилось( наверно я чтото не так делаю...
а второй вариант если можно розкажыте пожалуйста чем он плохой? ну чем это потом может повлиять на программу кроме того что надо будет каждый елемент и кнопку описивать отдельно....


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: SABROG от Декабрь 10, 2010, 15:44
а второй вариант если можно розкажыте пожалуйста чем он плохой?
Тем, что фокус нельзя перемещать между кнопками и соответственно нельзя использовать клавиатуру для активации виджетов. Тем, что некоторые виджеты ведут себя определенным образом при получении и потери фокуса. В некоторых случаях на эти события могут быть повешены определенные проверки. Например при потери фокуса QLineEdit можно проверять корректность введенной информации и т.п.

Я не знаю почему у Вас вылетает приложение, надо смотреть исходные коды.


Название: Re: CheckBox и RadioButton - штриховое выделение
Отправлено: ysfox от Декабрь 10, 2010, 16:06
Спасибо... за это я знал, думал там еще чтото есть... клавиатуры как такой на приборе скоро не будет, так что за это я не безпокоюсь, да и собственно проверки в едитах я делаю через изменение положения курсора - так в реальном времени проверяю все что вводит пользователь, и соотвецтвенно сразу фильтрую :)

пока поставлю 2м вариантом так как время поджымает) и сяду разбератся почему у меня не работает Ваш, думаю найду где моя ошыбка :)