crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> При выводе текста потребляется много ресурсов
Командор
  опции профиля:
сообщение 7.3.2011, 12:56
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.3.2011
Пользователь №: 2478

Спасибо сказали: 0 раз(а)




Репутация:   0  


Мне нужно на виджете выводить текст, который регулярно меняется (либо по сигналам, либо по событиям). Текст вывожу через QPainter следующим образом:

#include <QtGui>

class Widget : public QWidget
{

public:
    Widget(QWidget* parent = 0) : QWidget(parent)
    {
    }
    QPainter Painter;
    int k;

    void paintEvent(QPaintEvent* event)
    {
        Painter.begin(this);
        for (int i = 0; i < 30; i++)
        {
            k++;
            Painter.drawText(0, i*24, 200, 24, Qt::AlignVCenter, QString::number(k)+"Text Text"+QString::number(k)+ "Text Text Text Text ");
        }
        Painter.end();
    }

    void timerEvent(QTimerEvent* event)
    {
        repaint();
    }

    void keyPressEvent(QKeyEvent* event)
    {
        repaint();
    }

};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    //w.startTimer(50);

    return a.exec();
}


При нажатии на любую клавишу на экране меняется текст. Если удерживать клавишу, то системный монитор показывает загрузку 20-25% (Windows 7, AMD 5000+). Но если раскомментировать таймер и рисование будет происходить по таймеру, то загрузка 5-7%. И вот не могу понять, почему при событиях от таймера, которых примерно также, как и при удерживании клавиши, загрузка меньше? Т.е. получается, что при событии от клавиатуры что-то тормозит. Ни у кого нет соображений?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 7.3.2011, 15:45
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


так 50 мс это намного реже, чем приход событий от клавиатуры, ставь 0 и наслаждайся тормозами :) ну, это моё предположение. почему не использовать QLabel для текстопляски?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Командор
  опции профиля:
сообщение 7.3.2011, 16:51
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.3.2011
Пользователь №: 2478

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(abc @ 7.3.2011, 15:45) *
так 50 мс это намного реже, чем приход событий от клавиатуры, ставь 0 и наслаждайся тормозами :) ну, это моё предположение. почему не использовать QLabel для текстопляски?


Если переменную k обнулить в конструкторе, то у меня в секунду k набегает примерно на 1000, т.е. 30 раз выполняется repaint. Вообще, если количество элементов увеличить, то разница от событий по таймеру и клавиатуре уже никакая. Но загруз процессора большой. QLabel так же тормозит, только что проверил. Просто я хотел сделать быстрый виртуальный список, который отображает кусок больших данных в виде строк, а при нажатии вверх-вниз "сдвигает" текст, создавая иллюзию скроллинга. Но при таких скоростях лучше, наверное, просто использовать qscrollarea или представления.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.3.2011, 7:58
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Командор, если текст показывается человеку, то нет смысла так часто обновлять, это же не анимация. Раз в 250...500 мс обновление экрана - сойдёт для этой цели. А накапливать нужно в буфере в ОЗУ, отображать же только видимую часть текста. Будет летать :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 7:13