БлогNot. QT: как сделать собственную консоль для виджета

QT: как сделать собственную консоль для виджета

Цель очень простая - чтобы вывод из qDebug() шёл куда-то в отдельный текстовый контейнер.

В прикреплённом примере консолью служит статический созданный в отдельном окне QTextEdit. Если его закрыть в процессе работы программы, ничего страшного не произойдёт - сообщения начнут уходить в stderr. Если закрыть главное окно, с ним закроется и консоль.

Для вывода в консоль будем просто кидать что нужно в qDebug(), например

qDebug() << ui->plainTextEdit->toPlainText();

Это будет хорошо работать для однопоточного приложения. Если начать использовать qDebug() вне потока GUI, всё может рухнуть. Чтобы этого избежать, нужно создавать QueuedConnection из любой многопоточной функции, которая не работает в основном потоке GUI, чтобы подключиться к имеющемуся экземпляру Widget::s_textEdit, примерно так:

QObject::connect (otherThread, SIGNAL(debug(QString)), 
 s_textEdit, SLOT(append(QString)), Qt::QueuedConnection);

Можно сделать и много других улучшений, скажем, если в приложении применяется QDockWidget и QMenu, подход может выглядеть так:

//Создадим меню:
QMenu * menu;
menu = this->menuBar()->addMenu("About");
menu->setObjectName(menu->title());

//Создадим виджет:
QDockWidget *dock;
dock = new QDockWidget ("Console", this);
dock->setObjectName (dock->windowTitle());
dock->setWidget (s_textEdit);
s_textEdit->setReadOnly (true);
this->addDockWidget (Qt::RightDockWidgetArea, dock);
this->findChild <QMenu*>("About")->addAction (dock->toggleViewAction());
Исходный пример в работе (скриншот)
Исходный пример в работе (скриншот)

 Скачать исходный пример в архиве .zip с проектом QT 5.X, папка уже создана внутри архива (3 Кб)


теги: программирование c++ qt textprocessing

20.06.2020, 15:25; рейтинг: 58