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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с qss  (Прочитано 4091 раз)
radislav72
Гость
« : Апрель 22, 2010, 16:55 »

Возникла такая проблема с qss:

Надо, чтобы виджеты в окне формы, обязательные к заполнению, выделялись красной рамкой. С такой целью использую стиль
Код:
*[requiredField="true"] {
    border: 1px solid #FFB7B7;
}
(свойство requiredField программно задается для всех нужных виджетов).
Но таким образом выделяются почему-то не все виджеты. На приведенном рисунке все поля должны быть выделены таким образом, но... видно что получается. "Проблемными" являются компоненты в QTabWidget и QComboBox-ы. Причем на другой вкладке QTabWidget некоторые виджеты выделяются. Но если ее сделать активной по умолчанию (при создании окна), то- не выделяются. Диалог создан в QT Designer. QT 4.6.2.

Может, кто знает как попроще решить?

Читал, что со стилями для комбобоксов в QT вообще какой-то баг имеется. Так ли? И как обойти?

Записан
fuCtor
Гость
« Ответ #1 : Апрель 23, 2010, 07:14 »

Буквально вчера подобное делал, только без QSS:

Код
C++ (Qt)
bool MyDialog::eventFilter( QObject * o, QEvent * e )
{
if(e->type() == QEvent::Paint)
{
if(o->property("required").toBool())
{
QWidget * w = dynamic_cast<QWidget *>(o);
if(w && w->parentWidget()) {
w->parentWidget()->update(QRect(w->pos(), w->size()).adjusted(-3, -3, 3, 3)); // Update parent widget
}
} else {
QPainter p(qobject_cast<QWidget *>(o));
QPen pen_;
pen_.setWidth(2);
pen_.setColor(QColor(66, 126, 255)); // Set border color
p.setPen(pen_);
p.setRenderHint(QPainter::Antialiasing);
 
bool ready_ = true;
 
foreach(QObject * obj, o->children())
{
if(obj->property("required").toBool()) // Check widget
{
 
if(
(obj->inherits("QLineEdit") && obj->property("text").toString().isEmpty()) || // Check empty text field
(obj->inherits("QComboBox") && obj->property("currentText").toString().isEmpty()) ||  // Check empty combo box
(obj->inherits("QListView") && ((QListView *)qobject_cast<QListView *>(obj))->model()->rowCount() == 0 )  // Check empty list
)
{
ready_ &= false;
QWidget * w = dynamic_cast<QWidget *>(obj);
if(w)
{
QRect r(w->pos(), w->size());
p.drawRect(r.adjusted(-1, -1, 1, 1));
}
}
}
}
sendButton_->setEnabled(ready_); // Enable send button
}
}
return QDialog::eventFilter(o, e);
}
 

Собственно использование:
Код
C++ (Qt)
frame->installEventFilter(this); // Container of fields
orgName_->setProperty("required", true); // Mark widget
       orgName_->installEventFilter(this);
 

Все получается довольно мило =)




Можно развить код, и в виде динамического параметра присвоить указатель на некоторый валидатор, тогда можно для каждого поля выполнить более гибкую проверку, так же и для более сложных виджетов (QTabWidget и т.п.).
« Последнее редактирование: Апрель 23, 2010, 10:30 от fuCtor » Записан
radislav72
Гость
« Ответ #2 : Апрель 23, 2010, 10:09 »

Да, точно, через eventFilter все работает прекрасно.

Большое спасибо ! Улыбающийся
Записан
radislav72
Гость
« Ответ #3 : Апрель 28, 2010, 10:38 »

Тут как б продолжение получилось:
http://www.prog.org.ru/topic_13324_0.html
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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