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 Кб)
20.06.2020, 15:25 [1939 просмотров]