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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ускорить отрисовку qtextedit  (Прочитано 6672 раз)
finny
Гость
« : Сентябрь 07, 2011, 23:58 »

Проблема заключается в следующем: в окне QMainWindow границы изменяются при помощи сплиттера. В правом сплиттере расположен qtextedit, отображающий форматированную (html) текстовую информацию. При огромных объёмах текста (~250 кб) изменение границ сплиттера осуществляется крайне медленно в силу тормозов прорисовки qtextedit. Можно ли как-нибудь кардинально ускорить перерисовку qtextedit при изменениях его размеров частности. Может быть, можно как-нибудь использовать аппаратное успорение или opengl? HELP!!!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 08, 2011, 11:15 »

Проблема заключается в следующем: в окне QMainWindow границы изменяются при помощи сплиттера. В правом сплиттере расположен qtextedit, отображающий форматированную (html) текстовую информацию. При огромных объёмах текста (~250 кб) изменение границ сплиттера осуществляется крайне медленно в силу тормозов прорисовки qtextedit. Можно ли как-нибудь кардинально ускорить перерисовку qtextedit при изменениях его размеров частности. Может быть, можно как-нибудь использовать аппаратное успорение или opengl? HELP!!!
Интересно, какое ускорение, кроме мощного CPU, ускорит пере-форматирование?
Вообще-то при таких ситуациях используют таймеры.
Перегрузите QTextEdit::resizeEvent() и в нём заряжайте таймер, после отработки которого уже вызывайте базовый resizeEvent().
Записан

Qt 5.11/4.8.7 (X11/Win)
finny
Гость
« Ответ #2 : Сентябрь 09, 2011, 18:26 »

Можно более подробно объяснить? И каким образом это коррелируется с paint event? Если несложно то по шагам и даже можно какой-нибудь псевдокод. Буду очень признателен.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 09, 2011, 22:46 »

И каким образом это коррелируется с paint event?
Никаким, т.к. вся проблема не в отрисовке, а в форматировании.

Цитировать
Если несложно то по шагам и даже можно какой-нибудь псевдокод.
Как-то так:
Код
C++ (Qt)
class TextEdit : public QTextEdit
{
Q_OBJECT
public:
   TextEdit( QWidget* parent = 0 )
   : QTextEdit( parent )
   {
         resize_timer_.setInterval( 50 );
         resize_timer_.setSingleShot( true );
         connect( resize_timer_, SIGNAL( timeout() ), this, SLOT( delayed_resize() ) );
   }
   virtual ~TextEdit() {}
 
protected slots:
   void delayed_resize()
   {
         QTextEdit::resizeEvent( &QResizeEvent( size(), old_size_ ) );
   }
 
protected:
    void resizeEvent( QResizeEvent* e )
    {
         if( !resize_timer_.isActive() )
           old_size_ = e->oldSize();
         resize_timer_.start();
    }
 
private:
   QTimer   resize_timer_;
   QSize    old_size_;
};
« Последнее редактирование: Сентябрь 10, 2011, 10:54 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
finny
Гость
« Ответ #4 : Сентябрь 10, 2011, 09:16 »

И последний вопрос: обязательно ли для этого делать наследник класса или можно перехватить resizeEvent для qtextedit в eventFilter?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Сентябрь 10, 2011, 10:52 »

И последний вопрос: обязательно ли для этого делать наследник класса или можно перехватить resizeEvent для qtextedit в eventFilter?
Это уж как хочется. Только с фильтром, имхо, по-сложнее будет да и не так красиво Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
finny
Гость
« Ответ #6 : Сентябрь 10, 2011, 11:54 »

Код:
void delayed_resize()
    {
          QTextEdit::resizeEvent( &QResizeEvent( size(), old_size_ ) );
    }

Вот откуда берётся size()?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Сентябрь 10, 2011, 12:05 »

Вот откуда берётся size()?
Код
C++ (Qt)
QSize QWidget::size() const
Записан

Qt 5.11/4.8.7 (X11/Win)
finny
Гость
« Ответ #8 : Сентябрь 10, 2011, 12:18 »

Я так и думал. А вот какой интервал для таймера будет оптимальным?
Кстати заметил ещё одну вещь: чем больше значение вертикального скролла(от 0 до 100), тем медленнее происходит update интерфейса. То есть если ползунок наверху то всё летает, а если внизу то значительно медленнее
Записан
_OLEGator_
Гость
« Ответ #9 : Октябрь 05, 2011, 15:20 »

как вариант, можно попробовать использовать QWebView вместо QTextEdit, если не требуется редактирование.
Должно работать быстрее.
Записан
artiom_kh
Гость
« Ответ #10 : Октябрь 11, 2011, 10:09 »

как вариант, можно попробовать использовать QWebView вместо QTextEdit, если не требуется редактирование.
Должно работать быстрее.
вообщем-то да, там движок от Google Chrome, правда не последних версий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Октябрь 11, 2011, 10:52 »

http://doc.qt.nokia.com/latest/qsplitter.html#opaqueResize-prop

Кажется оно, непонятно почему написано что вкл по дефолту.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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