37 setWindowFlags(Qt::Window);
38 setWindowTitle(
"Log");
39 resize(320, parent->height());
41 QGridLayout* grid =
new QGridLayout(
this);
42 grid->setContentsMargins(5, 10, 5, 5);
44 qRegisterMetaType<QTextCursor>(
"QTextCursor");
45 qRegisterMetaType<QTextBlock>(
"QTextBlock");
47 QTimer* timer =
new QTimer(
this);
54 std::cout, LogWidget::Update,
this);
56 std::cerr, LogWidget::Update,
this);
58 std::clog, LogWidget::Update,
this);
60 QHBoxLayout* left_button_layout =
new QHBoxLayout();
62 QPushButton* save_log_button =
new QPushButton(tr(
"Save"),
this);
63 connect(save_log_button, &QPushButton::released,
this, &LogWidget::SaveLog);
64 left_button_layout->addWidget(save_log_button);
66 QPushButton* clear_button =
new QPushButton(tr(
"Clear"),
this);
68 left_button_layout->addWidget(clear_button);
70 grid->addLayout(left_button_layout, 0, 0, Qt::AlignLeft);
72 QHBoxLayout* right_button_layout =
new QHBoxLayout();
74 grid->addLayout(right_button_layout, 0, 1, Qt::AlignRight);
76 text_box_ =
new QPlainTextEdit(
this);
77 text_box_->setReadOnly(
true);
78 text_box_->setMaximumBlockCount(max_num_blocks);
79 text_box_->setWordWrapMode(QTextOption::NoWrap);
80 text_box_->setFont(QFont(
"Courier", 10));
81 grid->addWidget(text_box_, 1, 0, 1, 2);
85 if (log_file_.is_open()) {
89 delete cout_redirector_;
90 delete cerr_redirector_;
91 delete clog_redirector_;
95 QMutexLocker locker(&mutex_);
99 if (log_file_.is_open()) {
105 QMutexLocker locker(&mutex_);
107 if (text_queue_.size() > 0) {
109 text_box_->moveCursor(QTextCursor::End);
110 text_box_->insertPlainText(QString::fromStdString(text_queue_));
111 text_box_->moveCursor(QTextCursor::End);
117 QMutexLocker locker(&mutex_);
122 void LogWidget::Update(
const char* text, std::streamsize
count,
123 void* log_widget_ptr) {
124 std::string text_str;
125 for (std::streamsize i = 0; i <
count; ++i) {
126 if (text[i] ==
'\n') {
134 log_widget->Append(text_str);
137 void LogWidget::SaveLog() {
138 const std::string log_path =
139 QFileDialog::getSaveFileName(
this, tr(
"Select path to log file"),
"",
144 if (log_path ==
"") {
148 std::ofstream file(log_path, std::ios::app);
149 CHECK(file.is_open()) << log_path;
150 file << text_box_->toPlainText().toUtf8().constData();