Daniel
Daniel

Reputation: 2726

Which qt widget should I use for message display?

The QStatusBar has just one line each time and I cannot track the history or save the history in a log file.

So I want to have a dock widget in my mainwindow that is able to display the messages I need in a multi-line way and auto-scrolling way and then automatically saved to a log file.

My question is how to do this in Qt?

Upvotes: 27

Views: 30960

Answers (1)

Fred
Fred

Reputation: 4954

If what you are looking for is something similar to the "Application Output" pane of QtCreator, then a simple QPlainTextEdit can do the job. You can call QPlainTextEdit::setReadOnly(true) if you don't want the user to be able to edit its content (i.e. only your application can write to it).

If you want auto-scrolling and automatically saving to a log file, you will need to subclass it though. Here's a little something to get you started:

#include <QCoreApplication>
class MyLogWindow : public QPlainTextEdit
{
    Q_OBJECT
/* snip */
public:
    void appendMessage(const QString& text);

private:
    QFile m_logFile;
};


void MyLogWindow::appendMessage(const QString& text)
{
    this->appendPlainText(text); // Adds the message to the widget
    this->verticalScrollBar()->setValue(this->verticalScrollBar()->maximum()); // Scrolls to the bottom
    m_logFile.write(text); // Logs to file
    // optional if you want to see the changes 
    // after appendPlainText() immediately
    // useful if you use this->appendMessage() in a loop
    QCoreApplication::processEvents();

}

I leave it to you to deal with the boilerplate (opening and closing the file, dealing with newlines, etc.).

Now, simply put an instance of MyLogWindow in a dock in your QMainWindow, and call MyLogWindow::appendMessage() every time you need to log something to have it displayed, scrolled and saved automatically.

Upvotes: 38

Related Questions