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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: CheckBox и RadioButton - штриховое выделение  (Прочитано 6963 раз)
ysfox
Гость
« : Декабрь 10, 2010, 10:47 »

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

Почитай про класс QStyle и унаследованные от него.
Записан
andrewshkovskii
Гость
« Ответ #2 : Декабрь 10, 2010, 11:26 »

Скриншот рамки покажи, а то что-то я не понял : )
Записан
ysfox
Гость
« Ответ #3 : Декабрь 10, 2010, 11:36 »


Вот выделена надпись "UST_B ", тоже самое и с радиобатонами... (он выделяется когда на него нажать - выделяется сам текст, а мне этого не надо, надо чтоб просто изменилась картинка и все)
лечится это просто - просто пишеш текст около них в лабеле и все... но блин зачем же тогда возможности самих виджетов, если вот таким варварским способом надо будет все переделывать(
« Последнее редактирование: Декабрь 10, 2010, 11:39 от ysfox » Записан
andrewshkovskii
Гость
« Ответ #4 : Декабрь 10, 2010, 12:18 »

Это InputFocus, убрать можно через css с помощь соответствующего псевдосостояния.
Записан
SABROG
Гость
« Ответ #5 : Декабрь 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);
 
Но у него есть свои подводные камни.
« Последнее редактирование: Декабрь 10, 2010, 12:48 от SABROG » Записан
ysfox
Гость
« Ответ #6 : Декабрь 10, 2010, 12:56 »

Это InputFocus, убрать можно через css с помощь соответствующего псевдосостояния.

щас попробую поискать, как его изменить...
спасибо!
Записан
ysfox
Гость
« Ответ #7 : Декабрь 10, 2010, 13:06 »

Вот так работает идеально:
Код:
ui->radioButton_CN_EXT->setFocusPolicy(Qt::NoFocus);
но это локальный вариант - только для какогото конкретного елемента. а вот глобально пробовал сделать - применить ко всей форме:
Код:
 ACTS12K::setFocusPolicy(Qt::NoFocus);
так почемуто ничего не выходит... хотя это можно понять - снимается только фокус с вормы а не виджетов на ней...

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


вот только было б меньше проблем просто както применить выше упомянутую функцыю ко всем виджетам на форме.... но как это зделать пока незнаю.
Записан
ysfox
Гость
« Ответ #8 : Декабрь 10, 2010, 15:26 »

или так, для глобального переопределения:
Код
C++ (Qt)
QApplication::setStyle(new ProxyStyle);
 

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

если делаю глобально програма просто вылетает, а так работает но ничего не изменилось( наверно я чтото не так делаю...
а второй вариант если можно розкажыте пожалуйста чем он плохой? ну чем это потом может повлиять на программу кроме того что надо будет каждый елемент и кнопку описивать отдельно....
Записан
SABROG
Гость
« Ответ #9 : Декабрь 10, 2010, 15:44 »

а второй вариант если можно розкажыте пожалуйста чем он плохой?
Тем, что фокус нельзя перемещать между кнопками и соответственно нельзя использовать клавиатуру для активации виджетов. Тем, что некоторые виджеты ведут себя определенным образом при получении и потери фокуса. В некоторых случаях на эти события могут быть повешены определенные проверки. Например при потери фокуса QLineEdit можно проверять корректность введенной информации и т.п.

Я не знаю почему у Вас вылетает приложение, надо смотреть исходные коды.
Записан
ysfox
Гость
« Ответ #10 : Декабрь 10, 2010, 16:06 »

Спасибо... за это я знал, думал там еще чтото есть... клавиатуры как такой на приборе скоро не будет, так что за это я не безпокоюсь, да и собственно проверки в едитах я делаю через изменение положения курсора - так в реальном времени проверяю все что вводит пользователь, и соотвецтвенно сразу фильтрую Улыбающийся

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


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