Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Январь 12, 2009, 17:35



Название: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: xintrea от Январь 12, 2009, 17:35
Здравствуйте!


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

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

setReadOnly(true)

или через

setTextInteractionFlags(Qt::TextBrowserInteraction)

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

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

Что делать?


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: xintrea от Январь 12, 2009, 18:47
Откопал вроде, надо пользоваться палитрами. Пока ниасилил чтоэтоза.


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: xintrea от Январь 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
...

?


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: BRE от Январь 12, 2009, 20:33
Потому что QStyle абстрактный класс и поэтому некоторые функции будут реализованы только в классах-потомках.


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: ритт от Январь 12, 2009, 21:05
>> because the following virtual functions are pure...


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: break от Январь 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 );
};
};

но наверняка можно и по другому.


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: xintrea от Январь 12, 2009, 21:13
Вспоминается анекдот "слабо гандон на глобус натянуть"?

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

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

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


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: Rcus от Январь 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);
Топорно, но почти работает (на самом деле надо цвета всего нескольких ролей переписать)


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: xintrea от Январь 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);
}
}

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


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: xintrea от Январь 12, 2009, 21:37
Придумал, цвет неактивного поля QTextEdit беру от QPalette::Window. Тогда цвет текстового поля становится равным цвету окружающего окна, и сразу понятно что поле неактивно.


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: SABROG от Январь 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);


Название: Re: Как показать, что QTextEdit заблокирован для редактирования.
Отправлено: xintrea от Январь 12, 2009, 22:08
Вот так всегда, промучаешься паралельно с другими, а кто-нибудь первее решение выложит :)

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