Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: radislav72 от Апрель 22, 2010, 16:55



Название: Проблема с qss
Отправлено: radislav72 от Апрель 22, 2010, 16:55
Возникла такая проблема с qss:

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

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

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

(http://s57.radikal.ru/i158/1004/19/44d1dc36556at.jpg) (http://radikal.ru/F/s57.radikal.ru/i158/1004/19/44d1dc36556a.jpg.html)


Название: Re: Проблема с qss
Отправлено: fuCtor от Апрель 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);
 

Все получается довольно мило =)
(http://s3.amazonaws.com/floomby/4_23_2010/GocMd54OE0y7HpOCbyJRiQ.jpg)
(http://s3.amazonaws.com/floomby/4_23_2010/UNOvnJXL0uwhExvxXyrWA.jpg)


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


Название: Re: Проблема с qss
Отправлено: radislav72 от Апрель 23, 2010, 10:09
Да, точно, через eventFilter все работает прекрасно.

Большое спасибо ! :)


Название: Re: Проблема с qss
Отправлено: radislav72 от Апрель 28, 2010, 10:38
Тут как б продолжение получилось:
http://www.prog.org.ru/topic_13324_0.html (http://www.prog.org.ru/topic_13324_0.html)