Здравствуйте, гость ( Вход | Регистрация )
kuzulis | Дата 6.8.2010, 14:09 |
Anticross, лог пиши постоянно в файл. А в TextEdit выводи только несколько текущих строк... Например ограничься 50-ю строками. т.е. при перемещении вертикального скроллбара ты просто подгружай из лог-файла нужные данные и отображай их в TextEdit. Одновременно при добавлении новой записи в лог-файл ты отображай её в TextEdit. Типа в данном случае TextEdit выступает как интерактивная гляделка лог-файла. -- Упс.. это таже идея что и в "Сообщение #11" ![]() |
|
BRE | Дата 6.8.2010, 13:59 |
Anticross если логи не обязательно выводить в QTextEdit, то использование QListView/QTableView и своей модели будет лучшим решением. | |
Алексей1153 | Дата 6.8.2010, 13:41 |
Anticross, да не думай, что там в виджете будет. Полагаю, что такое действие как "выделения строк и нажатия del" вообще нельзя допускать ) Лучше применить табличный виджет и сделать на нём фиксированное число строк - ровно сколько влазит на экран. Сообщения же пусть лежат в кеше (если своего нет, могу код скинуть, только там с MFC немного переделать придётся на Qt). И вот, пользователь будет двигать ползунок, а ты будешь двигать воображаемое окно, и оттуда отображать текущие строки. Будет быстро, красиво и монолитно )) Но сами сообщения надо будет в БД хранить (или в аналоге) |
|
Anticross | Дата 6.8.2010, 13:33 |
А иначе - это не утечка вовсе, а просто память то занимается потихоньку не удаляемыми данными Все правильно, в этом то и состоит задача: хранить все сообщения на ЖД а выводить в виджет лишь актуальную в данный момент. Причем визуально пользователь не должен ощутить никакой разницы(тобиш пролистывать как будто текст целяком хранится в виджете). И еще вопрос: Освободится ли выделенная память после удаления текста из виджета скажем путем выделения строк и нажатия del ? |
|
Алексей1153 | Дата 6.8.2010, 13:25 |
Понятно. Остаётся А иначе - это не утечка вовсе, а просто память то занимается потихоньку не удаляемыми данными |
|
Anticross | Дата 6.8.2010, 13:20 |
Собственно говоря вот : LOG_MESSAGE("Some text or QString here"); |
|
Алексей1153 | Дата 6.8.2010, 13:17 |
Anticross, я смотрел. По твоим словам у тебя - лог сообщений, а это никак не хранение в контроле, это по меньшей мере std::vector<QString*> или QList<QString*> а ещё лучше - кеш (в STL нету, я себе сам писал) насчёт того кода тебя пыатю - подоздеваю, что ты делаешь как-то так: myLog->message(new QString("12345")); отсюда может быть утечка. А иначе - это не утечка вовсе, а просто память то занимается потихоньку не удаляемыми данными ![]() |
|
Anticross | Дата 6.8.2010, 13:13 |
Посмотри еще это: http://www.prog.org.ru/topic_14489_0.html Небольшой сложностью по сравнению с этим решением есть то что пользователю должен быть доступен весь текст. По этому если лишь ограничить блок выводимых данных старый текст утеряется, что непозволительно в моем случае. |
|
Алексей1153 | Дата 6.8.2010, 13:10 |
Хорошо, покажи пример того, как ты снаружи класса вызываешь метод Log::message(const QString & msg) - как готовишь для него строку ? |
|
Anticross | Дата 6.8.2010, 13:01 |
LogWidget.h CODE #ifndef _LOGWIDGET_H_ #define _LOGWIDGET_H_ #include <QTextEdit> class LogWidget : public QTextEdit { //-------------------------------------------------------------------------------------------------- public: void error(const QString & msg) { setTextColor (WARNING_TEXT_COLOR); setFontWeight(QFont::Bold); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- public: void warning(const QString & msg) { setTextColor (WARNING_TEXT_COLOR); setFontWeight(QFont::Normal); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- public: void message(const QString & msg) { setTextColor (Qt::blue); setFontWeight(QFont::Normal); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- public: void debug (const QString & msg) { setTextColor (Qt::black); setFontWeight(QFont::Normal); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- }; #endif//_LOGWIDGET_H_ Log.h CODE #ifndef LOG_H #define LOG_H #include <QMutex> #define LOG_DEBUG Log::debug #define LOG_MESSAGE Log::message #define LOG_WARNING Log::warning #define LOG_ERROR Log::error class LogWidget; QT_BEGIN_NAMESPACE class QString; QT_END_NAMESPACE class Log { //-------------------------------------------------------------------------------------------------- private: static LogWidget * m_log; private: static QMutex m_mutex; //-------------------------------------------------------------------------------------------------- public: static void setLogWidget(LogWidget * wnd); //-------------------------------------------------------------------------------------------------- public: static void error (const QString & msg); public: static void warning(const QString & msg); public: static void message(const QString & msg); public: static void debug (const QString & msg); //-------------------------------------------------------------------------------------------------- }; #endif//LOG_H Log.cpp CODE #include "StdAfx.h" LogWidget * Log::m_log = NULL; QMutex Log::m_mutex; //-------------------------------------------------------------------------------------------------- void Log::setLogWidget(LogWidget * log) { QMutexLocker locker(&m_mutex); m_log = log; } //-------------------------------------------------------------------------------------------------- void Log::error(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qWarning(msg.toAscii()); else m_log->error(msg); } //-------------------------------------------------------------------------------------------------- void Log::warning(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qWarning(msg.toAscii()); else m_log->warning(msg); } //-------------------------------------------------------------------------------------------------- void Log::message(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qWarning(msg.toAscii()); else m_log->message(msg); } //-------------------------------------------------------------------------------------------------- void Log::debug(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qDebug(msg.toAscii()); else m_log->debug(msg); } //-------------------------------------------------------------------------------------------------- |
|
Просмотр темы полностью (откроется в новом окне) | |
![]() |
Текстовая версия | Сейчас: 2.12.2023, 23:47 |