Questions Concerning colorizing text in Ubuntu terminal.



  • Hello,
    I am asking for help in directing me to the correct forum for my questions.
    I have a Qt5 program that accesses a Ubuntu terminal, all the text is white.
    I also have this program in Perl, see pic.alt text
    I was hoping someone could help me with my questions about colorizing the text in terminal in Qt5. See pic.alt text
    Any help would be appreciated!
    Thanks!





  • Thank you! Here is a snippet of the Perl code that colorizes the terminal.

    # color codes for fancy terminal output (not to file)
      $type = "\e[1m\e[91m$type\e[0m" if ($type =~ m/(fatal|fail|error|stop)/i);# bold red
      $type = "\e[91m$type\e[0m" if ($type =~ m/(refused|nodevice|timeout)/i);  # red
      $type = "\e[93m$type\e[0m" if ($type =~ m/(reset|warning|secure|unset)/i);# yellow
      $type = "\e[95m$type\e[0m" if ($type =~ m/(add|update|delete)/i);         # magenta
      $type = "\e[96m$type\e[0m" if ($type =~ m/(list|uplink)/i);               # cyan
      $type = "\e[94m$type\e[0m" if ($type =~ m/(beacon|syncer)/i);             # blue
      $type = "\e[92m$type\e[0m" if ($type =~ m/(stat|kfnew)/i);                # green
      $type = "\e[1m\e[92m$type\e[0m" if ($type =~ m/(info|debug)/i);           # bold green
    

    I was hoping Qt5 would be as easy as this.
    Thanks for helping!


  • Lifetime Qt Champion

    Hi,

    AFAIK, you can pass these sequences to qDebug and they will be shown colorized on your terminal.

    The syntax will be a bit different for the if parts though.



  • Thanks!
    I searched, "Passing sequences in qDebug" , got nothing.

    Perl
    $type = "\e[91m$type\e[0m" if ($type =~ m/(refused|nodevice|timeout)/i);  # red
        Qt5
    printf("\\x1B[31mTexting\\033[0m\\t\\t");\line
    

    With both of those lines I can see the color will be red.
    With Perl I can see the words that will be highlighted red. (refused|nodevice|timeout)
    With Qt5 I have no idea what text is going to be highlighted.
    I'm hoping someone can help me with the Qt5 line with setting it up to highlight the text like in Perl. This is for Ubuntu.
    Thanks!


  • Lifetime Qt Champion

    The same way you are doing with Perl: using regulate expression.

    QRegularExpression.

    There are other possibilities like simple string search.

    Up to you to benchmark what works best for your use case.



  • Thank you very much!
    Also I read this, "Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct".
    But there was no box or a way to mark as read so I see it everywhere like I am suppost to read it again, is that normal or am I missing something?

    I hope I am on to something that will work!

    
    	text
            {
             text: "(refused|nodevice|timeout)"
             font.family: "Courier New"
             font.pointSize: 12
             color: "red"
        }
    


  • Amin, if this is against forum rules please delete!
    After trying to get this to work I realize I'm too old, blind, deaf, with bad health to do this.
    I would be willing to pay someone via PayPal to help me get this to work.
    If interested please contact me at wpt1114 at yahoo.com to discuss the details.
    Thanks!



  • @Cougar-0 said in Questions Concerning colorizing text in Ubuntu terminal.:

    After trying to get this to work I realize I'm too old, blind, deaf, with bad health to do this.

    Sorry to hear that. Do you mean you just want to translate the 10 lines of Perl code you wrote above to C++/Qt? I will post that for you if that's what you want (no charge!). But if you want someone to do your whole project please say so, because that's not me.

    I hope I am on to something that will work!

    Your code here looks like Qt's QML? Is that what you want to use, because again that's not me, or are you wanting a Qt widgets application?



  • All I need is this;

    #include "whatever file is/if needed!"
    #include "whatever file is/if needed!"
    
    ( line of code or what's needed)
    
    [Rewrite the following Perl into C++/Qt.]
    {
           {
           "$type = "\e[1m\e[91m$type\e[0m" if ($type =~ 
           m/(fatal|fail|error|stop)/i);# bold red"
           "$type = "\e[91m$type\e[0m" if ($type 
             =~m/(refused|nodevice|timeout)/i);  # red" 
           }
    }
    

    The Qt5 code written completely that would replace the Perl lines of code above that highlights those 4 words in Bold Red and those 3 words in Red in a ubuntu terminal.
    Once I have those 4 + 3 words highlighted in Bold Red and Red in terminal working, I can add the other words and colors to the file.
    I hope I explained it for you.

    JonB, thank you for offering to rewrite all 10 Perl lines into C++/Qt5 for me at no charge. Really, thank you so very much!
    But if you could do just those two lines, then I can finish it and learn a little!
    Again Thanks!


  • Lifetime Qt Champion

    @Cougar-0 said in Questions Concerning colorizing text in Ubuntu terminal.:

    Amin, if this is against forum rules please delete!

    It's a banner shown to everybody, you did nothing wrong.

    From the top of my head something as below:.

    WARNING THIS IS WRONG AND LEFT FOR EDUCATIONAL PURPOSE
    #include <QRegularExpression>
    
    void printColorized(const QString& text)
    {
        QString toPrint;
        if (text.contains(QRegularExpression("(fatal|fail|error|stop)")) {
            toPrint = QString("\e[1m\e[91m%1\e[0m").arg(text);
    }
        if (text.contains(QRegularExpression("(refused|nodevice|timeout)"))) {
            toPrint = QString("\e[91m%1\e[0m").arg(text);
    }
    qDebug() << toPrint;
    }
    

    Here is the correct way to trigger the colorization of the terminal manually:

    #include <QRegularExpression>
    #include <QCoreApplication>
    #include <QString>
    #include <QtDebug>
    
    void printColorized(const QString& text)
    {
        if (text.contains(QRegularExpression("(fatal|fail|error|stop)"))) {
        qDebug() << "\e[1m\e[91m" << text << "\e[0m";
    }
        if (text.contains(QRegularExpression("(refused|nodevice|timeout)"))) {
            qDebug() << "\e[91m" << text << "\e[0m";
    }
    }
    

    [add fixed version as the original will just print the QString content SGaist]



  • SGaist, Thank you so much I will give this a try!



  • After several tries with using the code above, I have had no success in getting it to work.
    More info about my project.
    My friend Tim is the true genius in this. I'm just an old man. It is his Perl and Qt code.
    He is so busy with work, school and family, 25 hours a day, 8 days a week!
    I was hoping to surprise him with getting the color text working in the terminal.
    I told him what I was doing and he told me the reason he did not pursue the color text in Qt was because the color text in Perl messed with his log files, besides I am the one who misses the color text.
    Here is links to the masterserver website and qt5 source code.
    http://333networks.com/
    http://git.333networks.com/MasterServer-Qt5/
    Tim suggested I write a "Hello World" project implementing color text.
    If anyone has or knows of any links to "Hello World" examples with text in color using Qt Creator please post.
    He said he was not sure if Qt supports color text in terminal output like Perl does.
    I will keep at this besides it gives me something to do, it's all for kicks and giggles for me.
    I wish I had 5 years to take a course to learn all of this or a personal instructor to teach me.
    If anyone feels I owe them please contact me through my email above.
    Thanks for all those who helped!
    My desk,
    alt text
    If interested my masterserver website:
    gonespy.com!


  • Lifetime Qt Champion

    @Cougar-0 said in Questions Concerning colorizing text in Ubuntu terminal.:

    I have had no success in getting it to work

    Can you show the code?
    I think you need to escape the \
    Like:

    if (text.contains(QRegularExpression("(fatal|fail|error|stop)")) {
            toPrint = QString("\\e[1m\\e[91m%1\\e[0m").arg(text);
    


  • @jsulm said in Questions Concerning colorizing text in Ubuntu terminal.:

    I think you need to escape the \

    toPrint = QString("\\e[1m\\e[91m%1\\e[0m").arg(text);

    I don't think so :) It takes a brave man to challenge @SGaist, especially if he has typed in code inside backticks. But here he is right. You do not want "\\e" here, to deliver a literal \e. What you want is the C++ literal for "escape character" (ANSI sequences are all escape-[-....)

    \e = \x1B = escape (non-standard GCC extension)

    Seems like it's a GCC non-standard though, because I had never seen it before; \x1B (or \033) is the portable version....



  • @jsulm said in Questions Concerning colorizing text in Ubuntu terminal.:

    Can you show the code?

    Here is a link to download masterserver Qt5 and/or view all the cpp and h files.
    http://git.333networks.com/MasterServer-Qt5/commit/



  • @SGaist said in Questions Concerning colorizing text in Ubuntu terminal.:

    It's a banner shown to everybody, you did nothing wrong.

    Is there a way to mark as read so no more banner?
    I checked and did not find a way to mark as read.


  • Lifetime Qt Champion

    @Cougar-0 said in Questions Concerning colorizing text in Ubuntu terminal.:

    Is there a way to mark as read so no more banner?

    No, it's a site wide banner.


  • Lifetime Qt Champion

    Here is a fixed version of my original idea:

    #include <QRegularExpression>
    #include <QCoreApplication>
    #include <QString>
    #include <QtDebug>
    
    void printColorized(const QString& text)
    {
        if (text.contains(QRegularExpression("(fatal|fail|error|stop)"))) {
            qDebug() << "\e[1m\e[91m" << text << "\e[0m";
        } else if (text.contains(QRegularExpression("(refused|nodevice|timeout)"))) {
            qDebug() << "\e[91m" << text << "\e[0m";
        }
    }
    
    int main(int argc, char **argv)
    {
        QCoreApplication app(argc, argv);
        printColorized("fatal");
        printColorized("there is nodevice");
        return 0;
    }
    


  • Thank you, I will give that a try.



  • I created a file named colortext.cpp .
    I placed the file in the logger folder.
    I even added the line to the file in the .pro file , if I'm not mistaken that file is created when project is compiled.
    Nothing.
    I tried implementing the code into other files, results were the same nothing.
    My next question is, did I need to recompile all of this code in Qt Creator?
    The links above will take you to all the source code.
    I did create my first project with Qt Creator according to this link.
    https://vitux.com/compiling-your-first-qt-program-in-ubuntu/
    Worked on the first try.
    Now can anyone show me how to add color and resizing code for the text?

    #include <QApplication>
    #include <QLabel>
    #include <QWidget>
    
    int main(int argc, char *argv[ ])
    {
    
    QApplication app(argc, argv);
    QLabel hello("<center>Welcome to my first Qt program</center>");
    hello.setWindowTitle("My First Qt Program");
    hello.resize(400, 400);
    hello.show();
    return app.exec();
    
    }
    

    Should I not be able to just add the code to the file that would enlarge the text and color each word a different color?

    See pic.
    https://hosting.photobucket.com/images/dd47/cougarxr7SC/Screenshot_from_2021-09-14_22-39-23.jpg?width=450&height=278&crop=fill


  • Lifetime Qt Champion

    Did you run my example as is successfully ?



  • Using your code I did the following,
    I created a file named colortext.cpp . Copied and pasted your code into it.
    I placed the file in the logger folder.
    I even added the line to the file in the .pro file , if I'm not mistaken that file is created when project is compiled.
    Nothing. No color text.
    I tried implementing the code into other files in the logger folder, results were the same nothing.
    My next question is, did I need to recompile all of this code in Qt Creator?
    That is why I did his simple project. Now to get the text in color, and possible change the size of the text.
    Just to see it I can get that to work.
    I do believe it is on my end, not sure what I am dong wrong, but figuring things out is half the fun of doing this.



  • I tried the following to see what would happen.

    #include <QApplication>
    #include <QLabel>
    #include <QWidget>
    #include <QRegularExpression>
    #include <QCoreApplication>
    #include <QString>
    #include <QtDebug>
    
    int main(int argc, char *argv[ ])
    {
    
    QApplication app(argc, argv);
    QLabel hello("<center>Welcome to my first Qt program</center>");
    hello.setWindowTitle("My First Qt Program");
    hello.resize(400, 400);
    hello.show();
    
    void printColorized(const QString& text)
    
        if (text.contains(QRegularExpression("Welcome to my first Qt program"))) {
            qDebug() << "\e[1m\e[91m" << text << "\e[0m";
        }
        return app.exec();
    }    
    

    Program ran with no error or change in color.


  • Lifetime Qt Champion

    One issue it that you are not calling printColorized in that test application.



  • @SGaist said in Questions Concerning colorizing text in Ubuntu terminal.:

    One issue it that you are not calling printColorized in that test application.

    May I ask where in your code does it call the "printColorized"?
    I looked and did not see it, plus I searched the web for "calling printColorizd in Qt" , and no results.
    I di find this about QColor Class.
    https://doc.qt.io/qt-5/qcolor.html
    If you code does not call it could that the reason I could not get colored text in my friends program?
    SGaist, if it is not too much trouble, could you do this,
    https://vitux.com/compiling-your-first-qt-program-in-ubuntu/
    and add color text it?
    Then I could see the code what it takes to colorize the text.
    Thank you for all your help.



  • I tried,

    #include <QApplication>
    #include <QLabel>
    #include <QWidget>
    #include <QRegularExpression>
    #include <QCoreApplication>
    #include <QString>
    #include <QtDebug>
    
    int main(int argc, char *argv[ ])
    {
    
    QApplication app(argc, argv);
    QLabel hello("<center>Welcome to my first Qt program</center>");
    hello.setWindowTitle("My First Qt Program");
    hello.resize(400, 400);
    hello.show();
    return app.exec();
    
    }
    void printColorized(const QString& text)
    {
        if (text.contains(QRegularExpression("My First Qt Program"))) {
            qDebug() << "\e[1m\e[91m" << text << "\e[0m";
        } 
        if (text.contains(QRegularExpression("Welcome to my first Qt program"))) {
            qDebug() << "\e[91m" << text << "\e[0m";
        }
    }
    
    int main(int argc, char **argv)
    {
        QCoreApplication app(argc, argv);
        printColorized("hello");
        printColorized("there is no text");
        return 0;
    }
    

    If calling printColorized in the above code is not being called then that could be why I am not able to get it to work?
    SGaist, I did change your original code to match what was needed here.


  • Lifetime Qt Champion

    two main functions?


  • Lifetime Qt Champion

    Beside the issue of having two main function, your printColorized version won't show anything on the console unless text contains something similar to the regular expressions you wrote there which neither "hello" nor "there is no text" do.



  • Totally missed the two main functions, kind of distracted, my heart is in a-vib, beating 160 beats a minute.
    Redid the code.

    #include <QApplication>
    #include <QLabel>
    #include <QWidget>
    #include <QRegularExpression>
    #include <QCoreApplication>
    #include <QString>
    #include <QtDebug>
    
    int main(int argc, char *argv[ ])
    {
    
    	QApplication app(argc, argv);
    	QLabel hello("<center>Welcome to my first Qt program</center>");
    	hello.setWindowTitle("My First Qt Program");
    	hello.show();
    	return app.exec();
    	}
    	
    void printColorized(const QString& text)
    	{
            if (text.contains(QRegularExpression("My First Qt Program"))) {
            qDebug() << "\e[1m\e[91m" << text << "\e[0m";
            } 
            if (text.contains(QRegularExpression("Welcome to my first Qt program"))) {
            qDebug() << "\e[91m" << text << "\e[0m";
            }
    
            {
            QCoreApplication app(argc, argv);
            printColorized("My First Qt Program");
            printColorized("Welcome to my first Qt program");
            return 0;
        }
    }    
    

    I thought this is what colored the text.

     if (text.contains(QRegularExpression("My First Qt Program"))) {
            qDebug() << "\e[1m\e[91m" << text << "\e[0m";
    


  • @Cougar-0 said in Questions Concerning colorizing text in Ubuntu terminal.:

    I thought this is what colored the text.

    It does. But I'm afraid your code is not right:

    • You have QApplication app(argc, argv); in main(). You must not have QCoreApplication app(argc, argv); in another function, like printColorized().

    • You have printColorized() doing the calls to printColorized(). You don't want that, and besides nothing in main() calls printColorized() in the first place.

    int main(int argc, char *argv[ ])
    {
    
    	QApplication app(argc, argv);
    	QLabel hello("<center>Welcome to my first Qt program</center>");
    	hello.setWindowTitle("My First Qt Program");
    	hello.show();
            printColorized("My First Qt Program");
            printColorized("Welcome to my first Qt program");
            return app.exec();
    }
    
    void printColorized(const QString& text)
    {
            if (text.contains(QRegularExpression("My First Qt Program"))) {
                qDebug() << "\e[1m\e[91m" << text << "\e[0m";
            } 
            if (text.contains(QRegularExpression("Welcome to my first Qt program"))) {
                qDebug() << "\e[91m" << text << "\e[0m";
            }
    }    
    

    Don't forget all this is going to do is show a colorized message in the console of Qt Creator, or maybe in a terminal if you run it that way. This will have nothing to do with the UI label you show, which will just show the original text. I don't know if that is what you intend. If you are expecting it to appear in the UI/on the label, it won't.



  • Tried the new code no luck.
    I believe I've pester you guys enough!
    I want to thank everyone who helped!
    I have other issues I need to tend to.
    Again, thanks guys it's been fun!

    Discovery!!
    All this time I have been adding new code into the testmain.cpp.
    All it takes to run the project/program was the compiled file, I believe it is a bin file.
    I removed all files and it ran, removed that one and it errored.
    So those file are not being read at all.
    So now I know you have to recompile it when adding new code to the file.
    Again Thanks for all the help guys!



  • Ok, JonB,
    I tried recompiling with your code and got an error.
    I tried searching online but there is nothing about it I cannot believe I am the first person to get this error.

    cougarxr7@GoneSpy:~/Programs/First Qt Program$ make
    g++ -c -pipe -O2 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I. -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o testmain.o testmain.cpp
    testmain.cpp: In function ‘int main(int, char**)’:
    testmain.cpp:16:9: error: ‘printColorized’ was not declared in this scope
       16 |         printColorized("My First Qt Program");
          |         ^~~~~~~~~~~~~~
    make: *** [Makefile:363: testmain.o] Error 1
    cougarxr7@GoneSpy:~/Programs/First Qt Program$ 
    

    error: ‘printColorized’ was not declared in this scope
    Have you seen that error before?
    Funny, the program still ran fine, no color though.


  • Lifetime Qt Champion

    @Cougar-0 said in Questions Concerning colorizing text in Ubuntu terminal.:

    error: ‘printColorized’ was not declared in this scope

    Simply put the printColorized function definition before main()...



  • It works!
    RedText.png

    Thanks everyone! I learned a lot!



  • Sorry to say, I'm back!
    If I may ask once again for your assistance!
    I am at a new point with this colorizing text project.
    Let me explain what I am doing/done..
    Knowing now how to recompile my friends code I have been doing that with the color code from you guys.
    After many attempts and compiling errors I did get it to compile without any errors.
    In my friends program is a logger folder of which I created a file named colortext.cpp. (see pic)alt text

    alt text
    I am only trying color 2 words at this time, "update and check", once they show up in color more can be added.
    Here is the code:

    #include "logger.h"
    
    void printColorized(const QString& text)
    {
        if (text.contains(QRegularExpression("update"))) { 
            qDebug() << "\e[1m\e[92m" << text << "\e[0m";
        }  
        if (text.contains(QRegularExpression("check"))) {
            qDebug() << "\e[93m" << text << "\e[0m";
        }
    }    
    int logger(int argc, char **argv)  
        {
            QCoreApplication app(argc, argv);
            printColorized("update");
            printColorized("check");
            return 0;
        }
    

    Plus logger.h

    #ifndef LOGGER_H
    #define LOGGER_H
    
    #include <QDir>
    #include <QFile>
    #include <QDateTime>
    #include <QTextStream>
    
    #include "Settings/settingstructure.h"
    #include "Core/version.h"
    #include "logprimitive.h"
    
    #include <QRegularExpression>  ( "These 4 include line were a part of the original
    #include <QCoreApplication>           code. I moved them here.")
    #include <QString>
    #include <QtDebug>
    
    class Logger
    {
    public:
        Logger();
        bool init(const QString          &applicationPath,
                  const SettingStructure &settings);
        void stop();
        void logEvent(const QString &messageType,
                      const QString &message);
    private:
        // path variables
        const QString _logDirectory = "../log";
        const QString _logLabel = "MasterServer-" + SHORT_VER;
        QString _logPath = "";
        // local variables
        int _cyclePeriod;
        QString _logFileName;
        QString _suppressLog;
        QString _suppressDisplay;
        // file i/o
        QFile _logFile;
    private:
        bool cycleLogFile();
        bool openLogFile();
        void closeLogFile();
        bool writeLogFile(const QString message);
    };
    #endif // LOGGER_H
    

    Here is a link to the folders where you can view the source files.
    http://git.333networks.com/MasterServer-Qt5/tree/src
    The good news is, it compiles! No errors! Bad news is no color text.
    I am hoping you guys can see my mistakes and help me fix this.
    I believe this is so close to working!
    Thanks!



  • After many attempts of trying to get this to work I have reason to believe QT does not support colorizing text in a linux terminal while scrolling updated information , like it is so easily done in Perl.
    I did an online search with google and duckduckgo and got one hit, this post.
    "Colorizing text in linux terminal with QT"
    That was a surprise.
    What was a major surprise was when I searched the index on Qt Creator for "Color Text" , and got nothing!
    Nothing, I could not believe it!
    Even though we were able to get color text in that, "My First QT Project", the colored text was in the terminal and not in the project.
    I would of thought it would of been done something like this.
    Original Code.

    #include <QApplication>
    #include <QLabel>
    #include <QWidget>
    int main(int argc, char *argv[ ])
    {
    QApplication app(argc, argv);
    QLabel hello("<center>Welcome to my first Qt program</center>");
    hello.setWindowTitle("My First Qt Program");
    hello.resize(400, 400);
    hello.show();
    return app.exec();
    }
    

    Modified code. Here we lose the window.

    void printColorized(const QString& text)
    {
            if (text.contains(QRegularExpression("My First Qt Program"))) {
                qDebug() << "\e[1m\e[91m" << text << "\e[0m";
            } 
            if (text.contains(QRegularExpression("Welcome to my first Qt program"))) {
                qDebug() << "\e[91m" << text << "\e[0m";
            }
    }
     
    ```int main(int argc, char *argv[ ])
    {
    
    	QApplication app(argc, argv);
    	QLabel hello("<center>Welcome to my first Qt program</center>");
    	hello.setWindowTitle("My First Qt Program");
    	hello.show();
            printColorized("My First Qt Program");
            printColorized("Welcome to my first Qt program");
            return app.exec();
    }
        
    

    Original Code. with modding, I have done this below as an example of how I think Qt should be to allow for the simplicity of this to work.

    #include <QApplication>
    #include <QLabel>
    #include <QWidget>
    
    #include <QTextSize>
    #include <QTextColor>
    
    int main(int argc, char *argv[ ])
    {
    QApplication app(argc, argv);
    QLabel hello("<center>Welcome to my first Qt program</center>");
    QTextSizeHello("<center>12<center>);
    QTextColorHello("<center>Bold Red<center>");
    hello.setWindowTitle("My First Qt Program");
    QtextSizeWindowTitle("14");
    QTextColorWindowTitle("Bold Blue");
    hello.resize(400, 400);
    hello.show();
    return app.exec();
    }
    

    The above code is just an example of how I would think that the code should/would/could work. Window would open with text in a different size and different colors.
    Does anyone know if it is possible to get a Dev from Qt to chime in on this?
    It would be good to find out if Qt even supports this.
    I want to thank all of you guys for your assistance in helping me with this! I plan to keep on trying to get this to work, and I hope I am successful.


  • Lifetime Qt Champion

    @Cougar-0 said in Questions Concerning colorizing text in Ubuntu terminal.:

    Does anyone know if it is possible to get a Dev from Qt to chime in on this?

    I don't know why Qt should care about colored text output in a console at all. Qt is a GUI framework.



  • Qt (software)
    "Non-GUI programs can also be developed, such as command-line tools and consoles for servers."

    From,
    https://en.wikipedia.org/wiki/Qt_(software)


  • Lifetime Qt Champion

    @Cougar-0 Still no reason to support some kind of coloring for a special terminal type...


Log in to reply