Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sergek от Февраль 13, 2015, 20:51



Название: Read Only
Отправлено: sergek от Февраль 13, 2015, 20:51
Коллеги,
как в таких виджетах, как QCheckBox, QSpinBox, QRadioButton и др., запретить изменение их величин, по аналогии с readOnly в QLineEdit?
Свойство enabled не подходит, т.к. оно изменяет отображение элемента.


Название: Re: Read Only
Отправлено: kambala от Февраль 13, 2015, 20:53
унаследуйся да перекрой соответствующие методы


Название: Re: Read Only
Отправлено: __Heaven__ от Февраль 13, 2015, 22:06
или сигнал ловить и в обратную ставить


Название: Re: Read Only
Отправлено: Bepec от Февраль 13, 2015, 22:35
Ставить eventFilter и плевать свысока на все события :)


Название: Re: Read Only
Отправлено: sergek от Февраль 14, 2015, 10:43
Спасибо! Попробую.


Название: Re: Read Only
Отправлено: Igors от Февраль 14, 2015, 11:27
унаследуйся да перекрой соответствующие методы
Они не виртуальны, да и перекрывать многовато

Свойство enabled не подходит, т.к. оно изменяет отображение элемента.
Может все-таки setEnabled(false), а самому похимичить с палитрой/стилем чтобы отображалось как enabled


Название: Re: Read Only
Отправлено: Old от Февраль 14, 2015, 11:59
Можно попробовать установить для этих виджетов фильтр событий и игнорировать все события от мыши и клавиатуры.


Название: Re: Read Only
Отправлено: sergek от Февраль 14, 2015, 15:13
С фильтром работает, но у меня виджеты создаются динамически и придется химичить. Оставил на потом, как прототип одобрят.
Про палитру я думал, с ходу не получилось, но у меня нет опыта в этой части. Попробую разобраться.
Спасибо!


Название: Re: Read Only
Отправлено: Igors от Февраль 15, 2015, 08:55
Про палитру я думал, с ходу не получилось,
Вот делал для окна
Код
C++ (Qt)
// make active/inactive palettes same to avoid redraw when focus is changed
void SyncPalette( QWidget * w )
{
       QPalette newPalette, oldPalette = w->palette();
 
int numRoles = (int) QPalette::NColorRoles;
for (int role = 0; role < numRoles; ++role) {
QPalette::ColorRole role1 = (QPalette::ColorRole) role;
if (!newPalette.isBrushSet(QPalette::Active, role1))
newPalette.setBrush(role1, oldPalette.brush(QPalette::Active, role1));
}
 
w->setPalette(newPalette);
}
 
Можно попробовать Disabled вместо Active,


Название: Re: Read Only
Отправлено: sergek от Февраль 15, 2015, 20:34
Вот делал для окна
Хорошо, пригодится.