Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] переключить виджет в режим "на показ", запретить ввод, фокус, изменение курсора 
V
    Опции темы
JackYF
Дата 11.10.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Итак, дан виджет, например QTextEdit.

Вопрос следующий: как переключить этот или любой другой виджет в режим "только на показ"? То есть виджет только отрисовывает сам себя.
При этом запрещается изменение курсора, ввод, фокус, контекстное меню, выделение содержимого и любые другие действия, не связанное с отрисовкой виджета на форме.

Документацию QT4 рыл, не нарыл.

Это сообщение отредактировал(а) JackYF - 11.10.2007, 23:27


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 12.10.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Есть три идеи, работоспособность которых тебе придётся проверить самому(ибо у меня времени нет).

1. Унаследоваться от необходимого виджета и переопределить ф-цию event в которой и фильтровать все события, кроме отрисовки.
2. Возможно setFocusPolicy(Qt::NoFocus) сделает всё что тебе нужно.
3. Заменить нужный виджет пустым, но старый не удалять, а делать для него realWidget->render(dummyWidget/*, ... */), когда необходима перерисовка.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 12.10.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Интересно, а что если его просто выключить (setDisabled )?
PM   Вверх
archimed7592
Дата 12.10.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Це иногда изменяет внешний вид(становится серым, к примеру)...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 12.10.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



archimed7592, да. Но в т.з. не указано, что он должен отображаться, как обычно. smile
PM   Вверх
mes
Дата 12.10.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(JackYF @ 11.10.2007,  23:27)
Итак, дан виджет, например QTextEdit.

Вопрос следующий: как переключить этот или любой другой виджет в режим "только на показ"? То есть виджет только отрисовывает сам себя.

Чтоб TextEdit не принимал изменения нужно  установить флаг ReadOnly 


--------------------
PM MAIL WWW   Вверх
archimed7592
Дата 12.10.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



mes, а если другой виджет smile?

Речь не о TextEdit конкретно:
Цитата(JackYF @  11.10.2007,  23:27 Найти цитируемый пост)
Итак, дан виджет, например QTextEdit.




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 12.10.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  12.10.2007,  08:45 Найти цитируемый пост)
1. Унаследоваться от необходимого виджета и переопределить ф-цию event в которой и фильтровать все события, кроме отрисовки.

попробую


Цитата(archimed7592 @  12.10.2007,  08:45 Найти цитируемый пост)
2. Возможно setFocusPolicy(Qt::NoFocus) сделает всё что тебе нужно.

пробовал - не помогает.


Цитата(archimed7592 @  12.10.2007,  08:45 Найти цитируемый пост)
3. Заменить нужный виджет пустым, но старый не удалять, а делать для него realWidget->render(dummyWidget/*, ... */), когда необходима перерисовка.

пока не очень понял, но пороюсь в документации

Цитата(archimed7592 @  12.10.2007,  11:25 Найти цитируемый пост)
Це иногда изменяет внешний вид(становится серым, к примеру)...

абсолютно верно, поэтому и не подходит

Цитата(mes @  12.10.2007,  11:44 Найти цитируемый пост)
Чтоб TextEdit не принимал изменения нужно  установить флаг ReadOnly  

это само собой. Этот флаг и так установлен в первую очередь. Но курсор при наведении на виджет меняется и можно выделять даже read-only текст. + контекстное меню, которого быть не должно.

Цитата(bsa @  12.10.2007,  11:27 Найти цитируемый пост)
Но в т.з. не указано, что он должен отображаться, как обычно. smile 

Исправляюсь. Виджет должен отображаться, как обычно smile  smile 



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
nickless
Дата 15.10.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Вот еще вариант решения, возможно не самый красивый, но очень эффективный smile 

Поставить у нужного виджета focusPolicy = Qt::NoFocus, и положить сверху него QFrame того же размера, с frameShape = QFrame::NoFrame и autoFillBackground = false.
Будет всё видно, но до самого виджета юзер не доберётся.
Лучше это даже оформить в какой-нибудь контейнерный WidgetHider класс, который это всё делает (порядок создания виджетов похоже имеет значение, фрэйм надо позже создавать, по крайней мере в дизайнере).


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
JackYF
Дата 15.10.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(nickless @  15.10.2007,  16:34 Найти цитируемый пост)
Поставить у нужного виджета focusPolicy = Qt::NoFocus, и положить сверху него QFrame того же размера, с frameShape = QFrame::NoFrame и autoFillBackground = false.
Будет всё видно, но до самого виджета юзер не доберётся.
Лучше это даже оформить в какой-нибудь контейнерный WidgetHider класс

Очень неплохая идея, обязательно в скором времени попробую. Как только разгребусь с остальным...

Никто не забыт, ничто не забыто (с) smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
JackYF
Дата 19.10.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  12.10.2007,  08:45 Найти цитируемый пост)
1. Унаследоваться от необходимого виджета и переопределить ф-цию event в которой и фильтровать все события, кроме отрисовки.

Начал пробовать эту идею, однако эффект не тот немного...

Код

bool RichBoxWidget::event(QEvent* event)
{
    if (event->type() == QEvent::Paint)
    {
        QWidget::paintEvent((QPaintEvent*)event);
        return true;
    }
    else
    {
        return false;
    }
}

Следующий код оставляет изменение мышиного курсора и возможность выделения текста, при этом рамочки фрейма перестают почему-то рисоваться... Наверное, не подойдёт.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 19.10.2007, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Гхм... Что это ещё за c-style касты? 0_о
А если так:
Код

bool RichBoxWidget::event(QEvent* e)
{
    if (e->type() == QEvent::Paint)
    {
        return Base::event(e); // Base - класс от которого унаследовался...
    }
    else
    {
        return true;
    }
}


Это сообщение отредактировал(а) archimed7592 - 19.10.2007, 04:54


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 19.10.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  19.10.2007,  04:43 Найти цитируемый пост)
Base - класс от которого унаследовался...

QWidget и есть....

попробуем-с...


Цитата(archimed7592 @  19.10.2007,  04:43 Найти цитируемый пост)
Гхм... Что это ещё за c-style касты? 0_о

гм... static_cast<QPaintEvent*>(event) и иже с ним это правильно, но длинно, поэтому данные штуки я обычно пишу только в библиотечках...
В обычном юзеркоде (как здесь) жалею символы... Возможно, я поменяю данное мнение.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 19.10.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(JackYF @  19.10.2007,  14:10 Найти цитируемый пост)
гм... static_cast<QPaintEvent*>(event) и иже с ним это правильно, но длинно, поэтому данные штуки я обычно пишу только в библиотечках...
В обычном юзеркоде (как здесь) жалею символы... Возможно, я поменяю данное мнени

Всю конструкцию можно заменить этим:
Код

if (QPaintEvent *casted = qobject_cast< QPaintEvent * >(event))
{
  // ...
}

Два в одном smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 19.10.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  19.10.2007,  14:18 Найти цитируемый пост)
Два в одном smile. 

тоже вариант (в данном случае).


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0958 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.