Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How can I replce Qpainter::drawText with a more effecient way to draw text in a table cell
Forum Updated to NodeBB v4.3 + New Features

How can I replce Qpainter::drawText with a more effecient way to draw text in a table cell

Scheduled Pinned Locked Moved Unsolved General and Desktop
19 Posts 6 Posters 1.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • X xce1

    I've replaced all std::strings to QString, and change VS2019 charset to utf, and only use ASCII chars in string.
    Still there is a visible blank before the custom tables shows.

    Even there is only one column, one row.

    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by
    #8

    @xce1
    Your post is hurting my eyes! :( :)

    X 1 Reply Last reply
    1
    • X Offline
      X Offline
      xce1
      wrote on last edited by
      #9

      I've tested it with a single drawText call in paintEvent, the problem still exists.
      But if I put a label on widget, the problem disappears!
      main.cpp

      #include <QtWidgets/QApplication>
      #include "QPlainStyleTable.h"
      #include "QtClass.h"
      
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      
      //     auto _m_pTable = new QPlainStyleTable();
      //     _m_pTable->SetHeaderColor(Qt::red, Qt::green);
      //     _m_pTable->SetContentColor(Qt::gray, Qt::yellow, Qt::blue);
      //     _m_pTable->SetBorderColor(Qt::white);
      //     //_m_pTable->SetFont(QFont(u8"微软雅黑"), QFont(u8"微软雅黑"));
      // 
      //     _m_pTable->SetDimension(1, 1);
      // 
      //     _m_pTable->SetTitle({ "a", "b", "c", "d", "e" });
      //     _m_pTable->AddData({ "a1", "b1", "c1", "d1", "e1`" });
      //     _m_pTable->AddData({ "a2", "b2", "c2", "d2", "e2" });
      //     _m_pTable->AddData({ "a3", "b3", "c3", "d3", "e3" });
      //     _m_pTable->AddData({ "a4", "b4", "c4", "d4", "e4" });
      //     
      //     _m_pTable->show();
          auto _m_pQClass = new QtClass(nullptr);
          _m_pQClass->setFixedSize(500, 400);
          _m_pQClass->show();
          return a.exec();
      }
      

      QtClass.h

      #pragma once
      
      #include <QWidget>
      
      class QtClass : public QWidget
      {
          Q_OBJECT
      
      public:
          QtClass(QWidget *parent);
          ~QtClass();
      
          void paintEvent(QPaintEvent* e) override;
      };
      
      

      QtClass.cpp with QLabel commented out.

      #include "QtClass.h"
      
      #include <QPainter>
      #include <QLabel>
      
      QtClass::QtClass(QWidget *parent)
          : QWidget(parent)
      {
      //     auto _pLabel = new QLabel(this);
      //     _pLabel->setText("HELLO WORLD!");
      //     _pLabel->move(200, 300);
      }
      
      QtClass::~QtClass()
      {
      }
      
      void QtClass::paintEvent(QPaintEvent* e)
      {
          QPainter painter(this);
          painter.drawText(0, 0, 100, 200, Qt::AlignCenter | Qt::TextSingleLine | Qt::TextDontClip | Qt::TextWordWrap, QString("Hello World!"));
      }
      

      test4.gif

      QtClass.cpp with QLabel .

      #include "QtClass.h"
      
      #include <QPainter>
      #include <QLabel>
      
      QtClass::QtClass(QWidget *parent)
          : QWidget(parent)
      {
          auto _pLabel = new QLabel(this);
          _pLabel->setText("HELLO WORLD!");
          _pLabel->move(200, 300);
      }
      
      QtClass::~QtClass()
      {
      }
      
      void QtClass::paintEvent(QPaintEvent* e)
      {
          QPainter painter(this);
          painter.drawText(0, 0, 100, 200, Qt::AlignCenter | Qt::TextSingleLine | Qt::TextDontClip | Qt::TextWordWrap, QString("Hello World!"));
      }
      

      test5.gif

      X 1 Reply Last reply
      0
      • JonBJ JonB

        @xce1
        Your post is hurting my eyes! :( :)

        X Offline
        X Offline
        xce1
        wrote on last edited by
        #10

        @JonB Sorry about that. I've removed the colorful gifs.

        @jsulm Perhaps It's not drawText problem.
        To better demonstrate the situation, I've upload two new comparable gray gifs with a simpler QWidget subclass.

        1 Reply Last reply
        1
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #11

          Hi,

          Something just came to mind: maybe QStaticText might be of interest.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          X 1 Reply Last reply
          0
          • SGaistS SGaist

            Hi,

            Something just came to mind: maybe QStaticText might be of interest.

            X Offline
            X Offline
            xce1
            wrote on last edited by
            #12

            @SGaist Hi, thanks. I just tried that, It's still the same.

            1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #13

              I've no performance problem with your code on linux and windows7 (both in a VM, 64bit, Qt5.15.x)

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              X 1 Reply Last reply
              0
              • X xce1

                I've tested it with a single drawText call in paintEvent, the problem still exists.
                But if I put a label on widget, the problem disappears!
                main.cpp

                #include <QtWidgets/QApplication>
                #include "QPlainStyleTable.h"
                #include "QtClass.h"
                
                int main(int argc, char *argv[])
                {
                    QApplication a(argc, argv);
                
                //     auto _m_pTable = new QPlainStyleTable();
                //     _m_pTable->SetHeaderColor(Qt::red, Qt::green);
                //     _m_pTable->SetContentColor(Qt::gray, Qt::yellow, Qt::blue);
                //     _m_pTable->SetBorderColor(Qt::white);
                //     //_m_pTable->SetFont(QFont(u8"微软雅黑"), QFont(u8"微软雅黑"));
                // 
                //     _m_pTable->SetDimension(1, 1);
                // 
                //     _m_pTable->SetTitle({ "a", "b", "c", "d", "e" });
                //     _m_pTable->AddData({ "a1", "b1", "c1", "d1", "e1`" });
                //     _m_pTable->AddData({ "a2", "b2", "c2", "d2", "e2" });
                //     _m_pTable->AddData({ "a3", "b3", "c3", "d3", "e3" });
                //     _m_pTable->AddData({ "a4", "b4", "c4", "d4", "e4" });
                //     
                //     _m_pTable->show();
                    auto _m_pQClass = new QtClass(nullptr);
                    _m_pQClass->setFixedSize(500, 400);
                    _m_pQClass->show();
                    return a.exec();
                }
                

                QtClass.h

                #pragma once
                
                #include <QWidget>
                
                class QtClass : public QWidget
                {
                    Q_OBJECT
                
                public:
                    QtClass(QWidget *parent);
                    ~QtClass();
                
                    void paintEvent(QPaintEvent* e) override;
                };
                
                

                QtClass.cpp with QLabel commented out.

                #include "QtClass.h"
                
                #include <QPainter>
                #include <QLabel>
                
                QtClass::QtClass(QWidget *parent)
                    : QWidget(parent)
                {
                //     auto _pLabel = new QLabel(this);
                //     _pLabel->setText("HELLO WORLD!");
                //     _pLabel->move(200, 300);
                }
                
                QtClass::~QtClass()
                {
                }
                
                void QtClass::paintEvent(QPaintEvent* e)
                {
                    QPainter painter(this);
                    painter.drawText(0, 0, 100, 200, Qt::AlignCenter | Qt::TextSingleLine | Qt::TextDontClip | Qt::TextWordWrap, QString("Hello World!"));
                }
                

                test4.gif

                QtClass.cpp with QLabel .

                #include "QtClass.h"
                
                #include <QPainter>
                #include <QLabel>
                
                QtClass::QtClass(QWidget *parent)
                    : QWidget(parent)
                {
                    auto _pLabel = new QLabel(this);
                    _pLabel->setText("HELLO WORLD!");
                    _pLabel->move(200, 300);
                }
                
                QtClass::~QtClass()
                {
                }
                
                void QtClass::paintEvent(QPaintEvent* e)
                {
                    QPainter painter(this);
                    painter.drawText(0, 0, 100, 200, Qt::AlignCenter | Qt::TextSingleLine | Qt::TextDontClip | Qt::TextWordWrap, QString("Hello World!"));
                }
                

                test5.gif

                X Offline
                X Offline
                xce1
                wrote on last edited by
                #14
                This post is deleted!
                1 Reply Last reply
                0
                • Christian EhrlicherC Christian Ehrlicher

                  I've no performance problem with your code on linux and windows7 (both in a VM, 64bit, Qt5.15.x)

                  X Offline
                  X Offline
                  xce1
                  wrote on last edited by
                  #15

                  @Christian-Ehrlicher

                  Hi, Thank you for your attention.

                  Would you please take a look at the situation below ?

                  @xce1 said in How can I replce Qpainter::drawText with a more effecient way to draw text in a table cell:

                  I've tested it with a single drawText call in paintEvent, the problem still exists.
                  But if I put a label on widget, the problem disappears!
                  main.cpp

                  #include <QtWidgets/QApplication>
                  #include "QPlainStyleTable.h"
                  #include "QtClass.h"
                  
                  int main(int argc, char *argv[])
                  {
                      QApplication a(argc, argv);
                  
                  //     auto _m_pTable = new QPlainStyleTable();
                  //     _m_pTable->SetHeaderColor(Qt::red, Qt::green);
                  //     _m_pTable->SetContentColor(Qt::gray, Qt::yellow, Qt::blue);
                  //     _m_pTable->SetBorderColor(Qt::white);
                  //     //_m_pTable->SetFont(QFont(u8"微软雅黑"), QFont(u8"微软雅黑"));
                  // 
                  //     _m_pTable->SetDimension(1, 1);
                  // 
                  //     _m_pTable->SetTitle({ "a", "b", "c", "d", "e" });
                  //     _m_pTable->AddData({ "a1", "b1", "c1", "d1", "e1`" });
                  //     _m_pTable->AddData({ "a2", "b2", "c2", "d2", "e2" });
                  //     _m_pTable->AddData({ "a3", "b3", "c3", "d3", "e3" });
                  //     _m_pTable->AddData({ "a4", "b4", "c4", "d4", "e4" });
                  //     
                  //     _m_pTable->show();
                      auto _m_pQClass = new QtClass(nullptr);
                      _m_pQClass->setFixedSize(500, 400);
                      _m_pQClass->show();
                      return a.exec();
                  }
                  

                  QtClass.h

                  #pragma once
                  
                  #include <QWidget>
                  
                  class QtClass : public QWidget
                  {
                      Q_OBJECT
                  
                  public:
                      QtClass(QWidget *parent);
                      ~QtClass();
                  
                      void paintEvent(QPaintEvent* e) override;
                  };
                  
                  

                  QtClass.cpp with QLabel commented out.

                  #include "QtClass.h"
                  
                  #include <QPainter>
                  #include <QLabel>
                  
                  QtClass::QtClass(QWidget *parent)
                      : QWidget(parent)
                  {
                  //     auto _pLabel = new QLabel(this);
                  //     _pLabel->setText("HELLO WORLD!");
                  //     _pLabel->move(200, 300);
                  }
                  
                  QtClass::~QtClass()
                  {
                  }
                  
                  void QtClass::paintEvent(QPaintEvent* e)
                  {
                      QPainter painter(this);
                      painter.drawText(0, 0, 100, 200, Qt::AlignCenter | Qt::TextSingleLine | Qt::TextDontClip | Qt::TextWordWrap, QString("Hello World!"));
                  }
                  

                  test4.gif

                  QtClass.cpp with QLabel .

                  #include "QtClass.h"
                  
                  #include <QPainter>
                  #include <QLabel>
                  
                  QtClass::QtClass(QWidget *parent)
                      : QWidget(parent)
                  {
                      auto _pLabel = new QLabel(this);
                      _pLabel->setText("HELLO WORLD!");
                      _pLabel->move(200, 300);
                  }
                  
                  QtClass::~QtClass()
                  {
                  }
                  
                  void QtClass::paintEvent(QPaintEvent* e)
                  {
                      QPainter painter(this);
                      painter.drawText(0, 0, 100, 200, Qt::AlignCenter | Qt::TextSingleLine | Qt::TextDontClip | Qt::TextWordWrap, QString("Hello World!"));
                  }
                  

                  test5.gif

                  1 Reply Last reply
                  0
                  • Christian EhrlicherC Offline
                    Christian EhrlicherC Offline
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by
                    #16

                    @xce1 said in How can I replce Qpainter::drawText with a more effecient way to draw text in a table cell:

                    Would you please take a look at the situation below ?

                    That's the same code as above.

                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                    Visit the Qt Academy at https://academy.qt.io/catalog

                    X 1 Reply Last reply
                    0
                    • Christian EhrlicherC Christian Ehrlicher

                      @xce1 said in How can I replce Qpainter::drawText with a more effecient way to draw text in a table cell:

                      Would you please take a look at the situation below ?

                      That's the same code as above.

                      X Offline
                      X Offline
                      xce1
                      wrote on last edited by
                      #17

                      @Christian-Ehrlicher
                      Yes. It is. I thought maybe you missed the last post. Sorry about that.

                      I used Qt5.14.2 on Win10 VS2019.

                      Since no one else has the same problem. I'm about to just put a QLabel or other Qt widget to bypass it.

                      Thank you anyway.

                      J.HilkJ 1 Reply Last reply
                      0
                      • X xce1

                        @Christian-Ehrlicher
                        Yes. It is. I thought maybe you missed the last post. Sorry about that.

                        I used Qt5.14.2 on Win10 VS2019.

                        Since no one else has the same problem. I'm about to just put a QLabel or other Qt widget to bypass it.

                        Thank you anyway.

                        J.HilkJ Offline
                        J.HilkJ Offline
                        J.Hilk
                        Moderators
                        wrote on last edited by
                        #18

                        @xce1 have you tried a release build with O3 ? maybe its just a debug/development issue


                        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                        Q: What's that?
                        A: It's blue light.
                        Q: What does it do?
                        A: It turns blue.

                        X 1 Reply Last reply
                        0
                        • J.HilkJ J.Hilk

                          @xce1 have you tried a release build with O3 ? maybe its just a debug/development issue

                          X Offline
                          X Offline
                          xce1
                          wrote on last edited by
                          #19

                          @J-Hilk I just tried that. It's the same as no debug.
                          There is a visible blank background before "Hello World" shows up
                          if I didn't add a QLabel in QtClass constructor.
                          Thank you!

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved