Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 добавил эти два виджета в одну ячейку. Требуемая функциональность достигнута. ![]() Всем еще раз большое спасибо за участие, тему закрываю ![]() |