Russian Qt Forum
Ноябрь 25, 2024, 05:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как показать, что QTextEdit заблокирован для редактирования.  (Прочитано 8990 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 12, 2009, 17:35 »

Здравствуйте!


Имею на форме объект класса QTextEdit. Нужно в определенные моменты блокировать его так, чтобы редактирование содержимого текста было невозможно.

Это я могу сделать через метод

setReadOnly(true)

или через

setTextInteractionFlags(Qt::TextBrowserInteraction)

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

Я, конечно, могу дополнительно устанавливать цвет через textBackgroundColor(), но может быть я просто не нашел нужного метода. Метод setEnabled(false) не подходит - он  цветом показывает, что поле неактивно, но и не дает выделять и копировать текст в буфер обмена. А использовать textBackgroundColor() считаю несовсем корректным, ибо если у кого-то будет настроена "серая" тема, то при совпадении цвета пользователь просто не увидит что поле заблокировано.

Что делать?
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Январь 12, 2009, 18:47 »

Откопал вроде, надо пользоваться палитрами. Пока ниасилил чтоэтоза.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Январь 12, 2009, 20:15 »

Щит, не могу понять, почему нельзя создать объект класса QStyle?

Код:
#include <QStyle>
QStyle standart_style;

вызывает ошибку

Код:
src/editor.cpp:196: ошибка: cannot declare variable 'standart_style' to be of abstract type 'QStyle'
/usr/local/Trolltech/Qt-4.4.1/include/QtGui/qstyle.h:71: замечание:   because the following virtual functions are pure within 'QStyle':
/usr/local/Trolltech/Qt-4.4.1/include/QtGui/qstyle.h:215: замечание:    virtual void QStyle::drawPrimitive(QStyle::PrimitiveElement, const QStyleOption*, QPainter*, const QWidget*) const
/usr/local/Trolltech/Qt-4.4.1/include/QtGui/qstyle.h:284: замечание:    virtual void QStyle::drawControl(QStyle::ControlElement, const QStyleOption*, QPainter*, const QWidget*) const
...

?
Записан

Собираю информацию по крупицам
http://webhamster.ru
BRE
Гость
« Ответ #3 : Январь 12, 2009, 20:33 »

Потому что QStyle абстрактный класс и поэтому некоторые функции будут реализованы только в классах-потомках.
Записан
ритт
Гость
« Ответ #4 : Январь 12, 2009, 21:05 »

>> because the following virtual functions are pure...
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Январь 12, 2009, 21:07 »

Для того чтобы элементы на виджете были неактивны и серенькие - но можно было бы скопировать текст из edit-ов в буфер обмена пользовался вот такой штукой:


Код:
void setNonEditMode( QWidget& Widget , bool bNonEditMode )
{
// Проход по QLineEdit - там для соответствующего изменения их ReadOnly и FocusPolicy
QList<QLineEdit*> LE_List = Widget.findChildren<QLineEdit*>();

for ( QList<QLineEdit*>::iterator it = LE_List.begin(); it != LE_List.end(); it++ )
{
(*it)->setReadOnly( bNonEditMode );
if ( bNonEditMode )
(*it)->setFocusPolicy(Qt::NoFocus);
else
(*it)->setFocusPolicy(Qt::StrongFocus);
};

// Проход по QLabel - лам для соответствующего изменения их Enabled
QList<QLabel*> LB_List = Widget.findChildren<QLabel*>();

for ( QList<QLabel*>::iterator it = LB_List.begin(); it != LB_List.end(); it++ )
{
(*it)->setEnabled( !bNonEditMode );
};
};

но наверняка можно и по другому.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Январь 12, 2009, 21:13 »

Вспоминается анекдот "слабо гандон на глобус натянуть"?

Сделал задание цвета через QPalette, но это тоже некомильфо, потому что цвет всеравно задаю в явном виде.

А нужно, говоря человеческим языком, взять стиль элемента, которым он отрисовывается в "неактивном" состоянии, и заменить этим стилем стиль, который используется в нормальном виде. В комбинации с блокировкой редактирования, получится то что нужно.

Осталось понять, как взять стиль неактивного элемента, и натянуть его на стиль активного. Просветления нет.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Rcus
Гость
« Ответ #7 : Январь 12, 2009, 21:22 »

Код
C++ (Qt)
   QPalette pal = this->palette();
   for (int i = 0; i < 25; ++i)
       pal.setColor(QPalette::Active, (QPalette::ColorRole)i, pal.color(QPalette::Disabled,(QPalette::ColorRole)i));
   ui->progressBar->setPalette(pal);
Топорно, но почти работает (на самом деле надо цвета всего нескольких ролей переписать)
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Январь 12, 2009, 21:27 »

Сделал наконец франкенштейна.

Код
C++ (Qt)
void editor::set_textarea_editable(bool editable)
{
static int firstrunflag=0;
static QPalette standart_palette;
 
if(firstrunflag==0)
 {
  standart_palette=textarea->palette();
  firstrunflag=1;
 }  
 
if(editable==true)
{
 textarea->setTextInteractionFlags(Qt::TextEditorInteraction);
 textarea->setPalette(standart_palette);
}
else
{
 textarea->setTextInteractionFlags(Qt::TextBrowserInteraction);
 
 QPalette plt=standart_palette;
 QColor inactive_color;
 inactive_color=plt.color(QPalette::Disabled, QPalette::Base);
 plt.setColor(QPalette::Normal, QPalette::Base, inactive_color);
 textarea->setPalette(plt);
}
}

Одно плохо, в стандартных настройках обычный фон редактирования - серый, а неактивный - белый. Белый более яркий, и становится непонятно, почему на белом фоне редактирование невозможно. По-хорошему должно быть наоборот.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #9 : Январь 12, 2009, 21:37 »

Придумал, цвет неактивного поля QTextEdit беру от QPalette::Window. Тогда цвет текстового поля становится равным цвету окружающего окна, и сразу понятно что поле неактивно.
Записан

Собираю информацию по крупицам
http://webhamster.ru
SABROG
Гость
« Ответ #10 : Январь 12, 2009, 22:00 »

Вот так всегда, промучаешься паралельно с другими, а кто-нибудь первее решение выложит Улыбающийся

Код:
	QPalette pal = ui.textEdit->palette();
pal.setColor(QPalette::Active, QPalette::Base, qApp->palette().color(QPalette::Disabled, QPalette::Window));
ui.textEdit->setPalette(pal);
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #11 : Январь 12, 2009, 22:08 »

Вот так всегда, промучаешься паралельно с другими, а кто-нибудь первее решение выложит Улыбающийся

Понял тебя, избавился от статических переменных.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 23.