| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > [QT4] переключить виджет в режим "на показ" |
| Автор: JackYF 11.10.2007, 23:27 |
| Итак, дан виджет, например QTextEdit. Вопрос следующий: как переключить этот или любой другой виджет в режим "только на показ"? То есть виджет только отрисовывает сам себя. При этом запрещается изменение курсора, ввод, фокус, контекстное меню, выделение содержимого и любые другие действия, не связанное с отрисовкой виджета на форме. Документацию QT4 рыл, не нарыл. |
| Автор: archimed7592 12.10.2007, 08:45 |
| Есть три идеи, работоспособность которых тебе придётся проверить самому(ибо у меня времени нет). 1. Унаследоваться от необходимого виджета и переопределить ф-цию event в которой и фильтровать все события, кроме отрисовки. 2. Возможно setFocusPolicy(Qt::NoFocus) сделает всё что тебе нужно. 3. Заменить нужный виджет пустым, но старый не удалять, а делать для него realWidget->render(dummyWidget/*, ... */), когда необходима перерисовка. |
| Автор: bsa 12.10.2007, 11:22 |
| Интересно, а что если его просто выключить (setDisabled )? |
| Автор: archimed7592 12.10.2007, 11:25 |
| Це иногда изменяет внешний вид(становится серым, к примеру)... |
| Автор: bsa 12.10.2007, 11:27 |
| archimed7592, да. Но в т.з. не указано, что он должен отображаться, как обычно. |
| Автор: mes 12.10.2007, 11:44 | ||
Чтоб TextEdit не принимал изменения нужно установить флаг ReadOnly |
| Автор: archimed7592 12.10.2007, 12:40 |
| mes, а если другой виджет Речь не о TextEdit конкретно: |
| Автор: nickless 15.10.2007, 16:34 |
| Вот еще вариант решения, возможно не самый красивый, но очень эффективный Поставить у нужного виджета focusPolicy = Qt::NoFocus, и положить сверху него QFrame того же размера, с frameShape = QFrame::NoFrame и autoFillBackground = false. Будет всё видно, но до самого виджета юзер не доберётся. Лучше это даже оформить в какой-нибудь контейнерный WidgetHider класс, который это всё делает (порядок создания виджетов похоже имеет значение, фрэйм надо позже создавать, по крайней мере в дизайнере). |
| Автор: JackYF 15.10.2007, 18:51 | ||
Очень неплохая идея, обязательно в скором времени попробую. Как только разгребусь с остальным... Никто не забыт, ничто не забыто (с) |
| Автор: JackYF 19.10.2007, 00:21 | ||||
Начал пробовать эту идею, однако эффект не тот немного...
Следующий код оставляет изменение мышиного курсора и возможность выделения текста, при этом рамочки фрейма перестают почему-то рисоваться... Наверное, не подойдёт. |
| Автор: archimed7592 19.10.2007, 04:43 | ||
| Гхм... Что это ещё за c-style касты? 0_о А если так:
|
| Автор: JackYF 19.10.2007, 14:10 |
QWidget и есть.... попробуем-с... гм... static_cast<QPaintEvent*>(event) и иже с ним это правильно, но длинно, поэтому данные штуки я обычно пишу только в библиотечках... В обычном юзеркоде (как здесь) жалею символы... Возможно, я поменяю данное мнение. |
| Автор: archimed7592 19.10.2007, 14:18 | ||||
Всю конструкцию можно заменить этим:
Два в одном |
| Автор: JackYF 19.10.2007, 14:29 |
тоже вариант (в данном случае). |
| Автор: JackYF 19.10.2007, 22:28 |
тьфу, не QWidget, а тот самый QTextEdit. уже лучше. Остался курсор, осталось выделение, остальное ушло. Исследую дальше. При выделении текста и изменении курсора виджету, как было выяснено при дебаговом выводе, не посылаются сообщения. Следовательно, через виджет я заблокировать их я не могу. |
| Автор: JackYF 19.10.2007, 22:46 |
| Плюнул на всё, создал прозрачный фрейм по совету nickless, с помощью QGridLayout добавил эти два виджета в одну ячейку. Требуемая функциональность достигнута. Всем еще раз большое спасибо за участие, тему закрываю |