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 to convert QVariant to HTML
Forum Updated to NodeBB v4.3 + New Features

How to convert QVariant to HTML

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 6 Posters 1.5k Views 3 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.
  • M Offline
    M Offline
    Mikeeeeee
    wrote on last edited by
    #1

    Hi!
    How to convert QVariant to HTML?

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

      Hi,

      What is in your QVariant ?

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

      M 1 Reply Last reply
      1
      • VRoninV Offline
        VRoninV Offline
        VRonin
        wrote on last edited by VRonin
        #3

        It's not exahustive but it's a start (source):

        QString saveVariant(const QVariant& val)
        {
            if (val.isNull())
                return QString();
            switch (val.type()) {
            case QMetaType::UnknownType:
                Q_ASSERT_X(false, "saveVariant", "Trying to save unregistered type.");
                return QString();
            case QMetaType::Bool: return val.toBool() ? QStringLiteral("1") : QStringLiteral("0");
            case QMetaType::Long:
            case QMetaType::Short:
            case QMetaType::Char:
            case QMetaType::SChar:
            case QMetaType::Int: return QString::number(val.toInt());
            case QMetaType::ULong:
            case QMetaType::UShort:
            case QMetaType::UChar:
            case QMetaType::UInt: return QString::number(val.toUInt());
            case QMetaType::LongLong: return QString::number(val.toLongLong());
            case QMetaType::ULongLong:  return QString::number(val.toULongLong());
            case QMetaType::Double:  
            case QMetaType::Float: return guessDecimalsString(val.toDouble());
            case QMetaType::QChar: return QString(val.toChar());
            case QMetaType::QString: return val.toString();
            case QMetaType::QByteArray: return QString::fromLatin1(val.toByteArray().toBase64());
            case QMetaType::QDate: return val.toDate().toString(Qt::ISODate);
            case QMetaType::QTime: return val.toTime().toString(Qt::ISODate);
            case QMetaType::QDateTime: return val.toDateTime().toString(Qt::ISODate);
            case QMetaType::QImage: return saveImageVariant(val.value<QImage>());
            case QMetaType::QPixmap: return saveImageVariant(val.value<QPixmap>().toImage());
            case QMetaType::QBitmap: return saveImageVariant(val.value<QBitmap>().toImage());
            default:
                return variantToString(val);
            }
        }
        QString saveImageVariant(const QImage& imageData)
        {
            QByteArray byteArray;
            QBuffer buffer(&byteArray);
            imageData.save(&buffer, "PNG");
            return QString::fromLatin1(byteArray.toBase64().constData());
        }
        QString variantToString(const QVariant& val)
        {
            QString result;
            QByteArray data;
            QDataStream outStream(&data, QIODevice::WriteOnly);
            outStream << val;
            data = qCompress(data);
            return QString::fromLatin1(data.toBase64());
        }
        void writeHtmlVariant(QXmlStreamWriter& writer, const QVariant& val)
        {
            if (isImageType(val.type())) {
                writer.writeEmptyElement(QStringLiteral("img"));
                writer.writeAttribute(QStringLiteral("src"), "data:image/png;base64," + saveVariant(val));
                writer.writeAttribute(QStringLiteral("alt"), QStringLiteral("modelimage.png"));
                return;
            }
            writer.writeCharacters(saveVariant(val));
        }
        bool isImageType(int val) {
            switch(val){
            case QMetaType::QImage:
            case QMetaType::QPixmap:
            case QMetaType::QBitmap:
                return true;
            }
            return false;
        }
        

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        M 1 Reply Last reply
        4
        • SGaistS SGaist

          Hi,

          What is in your QVariant ?

          M Offline
          M Offline
          Mikeeeeee
          wrote on last edited by
          #4

          @SGaist In QVariant text and images from .docx file.

          1 Reply Last reply
          0
          • VRoninV VRonin

            It's not exahustive but it's a start (source):

            QString saveVariant(const QVariant& val)
            {
                if (val.isNull())
                    return QString();
                switch (val.type()) {
                case QMetaType::UnknownType:
                    Q_ASSERT_X(false, "saveVariant", "Trying to save unregistered type.");
                    return QString();
                case QMetaType::Bool: return val.toBool() ? QStringLiteral("1") : QStringLiteral("0");
                case QMetaType::Long:
                case QMetaType::Short:
                case QMetaType::Char:
                case QMetaType::SChar:
                case QMetaType::Int: return QString::number(val.toInt());
                case QMetaType::ULong:
                case QMetaType::UShort:
                case QMetaType::UChar:
                case QMetaType::UInt: return QString::number(val.toUInt());
                case QMetaType::LongLong: return QString::number(val.toLongLong());
                case QMetaType::ULongLong:  return QString::number(val.toULongLong());
                case QMetaType::Double:  
                case QMetaType::Float: return guessDecimalsString(val.toDouble());
                case QMetaType::QChar: return QString(val.toChar());
                case QMetaType::QString: return val.toString();
                case QMetaType::QByteArray: return QString::fromLatin1(val.toByteArray().toBase64());
                case QMetaType::QDate: return val.toDate().toString(Qt::ISODate);
                case QMetaType::QTime: return val.toTime().toString(Qt::ISODate);
                case QMetaType::QDateTime: return val.toDateTime().toString(Qt::ISODate);
                case QMetaType::QImage: return saveImageVariant(val.value<QImage>());
                case QMetaType::QPixmap: return saveImageVariant(val.value<QPixmap>().toImage());
                case QMetaType::QBitmap: return saveImageVariant(val.value<QBitmap>().toImage());
                default:
                    return variantToString(val);
                }
            }
            QString saveImageVariant(const QImage& imageData)
            {
                QByteArray byteArray;
                QBuffer buffer(&byteArray);
                imageData.save(&buffer, "PNG");
                return QString::fromLatin1(byteArray.toBase64().constData());
            }
            QString variantToString(const QVariant& val)
            {
                QString result;
                QByteArray data;
                QDataStream outStream(&data, QIODevice::WriteOnly);
                outStream << val;
                data = qCompress(data);
                return QString::fromLatin1(data.toBase64());
            }
            void writeHtmlVariant(QXmlStreamWriter& writer, const QVariant& val)
            {
                if (isImageType(val.type())) {
                    writer.writeEmptyElement(QStringLiteral("img"));
                    writer.writeAttribute(QStringLiteral("src"), "data:image/png;base64," + saveVariant(val));
                    writer.writeAttribute(QStringLiteral("alt"), QStringLiteral("modelimage.png"));
                    return;
                }
                writer.writeCharacters(saveVariant(val));
            }
            bool isImageType(int val) {
                switch(val){
                case QMetaType::QImage:
                case QMetaType::QPixmap:
                case QMetaType::QBitmap:
                    return true;
                }
                return false;
            }
            
            M Offline
            M Offline
            Mikeeeeee
            wrote on last edited by
            #5

            @VRonin it doesn't compile

            jsulmJ 1 Reply Last reply
            1
            • M Mikeeeeee

              @VRonin it doesn't compile

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @Mikeeeeee said in How to convert QVariant to HTML:

              it doesn't compile

              Then fix the issues in the code or at least post the compiler errors...

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              3
              • M Offline
                M Offline
                Mikeeeeee
                wrote on last edited by
                #7

                Too many errors, not enough files

                1 Reply Last reply
                0
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by VRonin
                  #8

                  @Mikeeeeee said in How to convert QVariant to HTML:

                  Too many errors

                  Fixed and turned into a working minimal example:

                  #include <QGuiApplication>
                  #include <QDataStream>
                  #include <QMetaType>
                  #include <QXmlStreamWriter>
                  #include <QBuffer>
                  #include <QImage>
                  #include <QBitmap>
                  #include <QPixmap>
                  #include <QVariant>
                  #include <QDateTime>
                  #include <QFile>
                  
                  int guessDecimals(double val)
                  {
                      int precision = 0;
                      for (double junk = 0; !qFuzzyIsNull(std::modf(val, &junk)); ++precision)
                          val *= 10.0;
                      return precision;
                  }
                  QString guessDecimalsString(double val, QLocale* loca  = Q_NULLPTR)
                  {
                      if (loca)
                          return loca->toString(val, 'f', guessDecimals(val));
                      return QString::number(val, 'f', guessDecimals(val));
                  }
                  bool isImageType(int val) {
                      switch(val){
                      case QMetaType::QImage:
                      case QMetaType::QPixmap:
                      case QMetaType::QBitmap:
                          return true;
                      }
                      return false;
                  }
                  QString saveImageVariant(const QImage& imageData)
                  {
                      QByteArray byteArray;
                      QBuffer buffer(&byteArray);
                      imageData.save(&buffer, "PNG");
                      return QString::fromLatin1(byteArray.toBase64().constData());
                  }
                  QString variantToString(const QVariant& val)
                  {
                      QString result;
                      QByteArray data;
                      QDataStream outStream(&data, QIODevice::WriteOnly);
                      outStream << val;
                      data = qCompress(data);
                      return QString::fromLatin1(data.toBase64());
                  }
                  
                  QString saveVariant(const QVariant& val)
                  {
                      if (val.isNull())
                          return QString();
                      switch (val.type()) {
                      case QMetaType::UnknownType:
                          Q_ASSERT_X(false, "saveVariant", "Trying to save unregistered type.");
                          return QString();
                      case QMetaType::Bool: return val.toBool() ? QStringLiteral("1") : QStringLiteral("0");
                      case QMetaType::Long:
                      case QMetaType::Short:
                      case QMetaType::Char:
                      case QMetaType::SChar:
                      case QMetaType::Int: return QString::number(val.toInt());
                      case QMetaType::ULong:
                      case QMetaType::UShort:
                      case QMetaType::UChar:
                      case QMetaType::UInt: return QString::number(val.toUInt());
                      case QMetaType::LongLong: return QString::number(val.toLongLong());
                      case QMetaType::ULongLong:  return QString::number(val.toULongLong());
                      case QMetaType::Double:
                      case QMetaType::Float: return guessDecimalsString(val.toDouble());
                      case QMetaType::QChar: return QString(val.toChar());
                      case QMetaType::QString: return val.toString();
                      case QMetaType::QByteArray: return QString::fromLatin1(val.toByteArray().toBase64());
                      case QMetaType::QDate: return val.toDate().toString(Qt::ISODate);
                      case QMetaType::QTime: return val.toTime().toString(Qt::ISODate);
                      case QMetaType::QDateTime: return val.toDateTime().toString(Qt::ISODate);
                      case QMetaType::QImage: return saveImageVariant(val.value<QImage>());
                      case QMetaType::QPixmap: return saveImageVariant(val.value<QPixmap>().toImage());
                      case QMetaType::QBitmap: return saveImageVariant(val.value<QBitmap>().toImage());
                      default:
                          return variantToString(val);
                      }
                  }
                  void writeHtmlVariant(QXmlStreamWriter& writer, const QVariant& val)
                  {
                      if (isImageType(val.type())) {
                          writer.writeEmptyElement(QStringLiteral("img"));
                          writer.writeAttribute(QStringLiteral("src"), "data:image/png;base64," + saveVariant(val));
                          writer.writeAttribute(QStringLiteral("alt"), QStringLiteral("modelimage.png"));
                          return;
                      }
                      writer.writeCharacters(saveVariant(val));
                  }
                  
                  
                  int main(int argc, char **argv) {
                      QGuiApplication app(argc,argv);
                      QFile htmlOutPut("TestOutput.html");
                      if(!htmlOutPut.open(QIODevice::WriteOnly))
                          return 1;
                      htmlOutPut.write(QByteArrayLiteral("<!DOCTYPE html>"));
                      QXmlStreamWriter htmlWriter(&htmlOutPut);
                      htmlWriter.writeStartElement(QStringLiteral("html"));
                      htmlWriter.writeAttribute(QStringLiteral("xmlns"),QStringLiteral("http://www.w3.org/1999/xhtml"));
                      htmlWriter.writeAttribute(QStringLiteral("lang"),QStringLiteral("en"));
                      htmlWriter.writeAttribute(QStringLiteral("xml:lang"),QStringLiteral("en"));
                      htmlWriter.writeStartElement(QStringLiteral("head"));
                      htmlWriter.writeEmptyElement(QStringLiteral("meta"));
                      htmlWriter.writeAttribute(QStringLiteral("http-equiv"),QStringLiteral("Content-Type"));
                      htmlWriter.writeAttribute(QStringLiteral("content"),QStringLiteral("text/html; charset=utf-8"));
                      htmlWriter.writeStartElement(QStringLiteral("title"));
                      htmlWriter.writeCharacters(QStringLiteral("Testing Variant to Html"));
                      htmlWriter.writeEndElement(); //title
                      htmlWriter.writeEndElement(); //head
                      htmlWriter.writeStartElement(QStringLiteral("body"));
                      htmlWriter.writeStartElement(QStringLiteral("p"));
                      writeHtmlVariant(htmlWriter, QStringLiteral("The magic number is: "));
                      writeHtmlVariant(htmlWriter, 88);
                      writeHtmlVariant(htmlWriter, QStringLiteral(" and "));
                      writeHtmlVariant(htmlWriter, 3.21);
                      htmlWriter.writeEndElement(); //p
                      QPixmap blueImage(200,200);
                      blueImage.fill(Qt::blue);
                      writeHtmlVariant(htmlWriter,blueImage);
                      htmlWriter.writeEndDocument();
                      return 0;
                  }
                  

                  In QVariant text and images from .docx file.

                  What does this mean?

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  1 Reply Last reply
                  5
                  • M Offline
                    M Offline
                    Mikeeeeee
                    wrote on last edited by
                    #9

                    Excuse me.
                    This is compiled.
                    But if I do this:

                    HTMLString = ConvertDocInHTML::saveVariant(HTMLQVariant);
                    

                    ing an error:
                    D:\QTProject\ReaderResume\mainwindow.cpp:1198: ошибка: cannot call member function 'QString ConvertDocInHTML::saveVariant(const QVariant&)' without object
                    HTMLResume = ConvertDocInHTML::saveVariant(HTMLQVariant);
                    ^

                    1 Reply Last reply
                    0
                    • VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #10

                      put a static in front of the method declaration

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      1 Reply Last reply
                      4
                      • M Offline
                        M Offline
                        Mikeeeeee
                        wrote on last edited by
                        #11

                        this method returns plain text, not HTML

                        mrjjM 1 Reply Last reply
                        0
                        • M Mikeeeeee

                          this method returns plain text, not HTML

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          @Mikeeeeee
                          hi
                          But html is plain text.
                          like

                          <html><head/><body><p><span style=" font-size:8.25pt; font-weight:600;">THIS IS HTML</span></p></body></html>
                          

                          I think you need to explain better what you have in the QVariant and what you wish to convert it to.

                          1 Reply Last reply
                          7
                          • fcarneyF Offline
                            fcarneyF Offline
                            fcarney
                            wrote on last edited by
                            #13

                            Sarcastic response:

                            QString getHTML(){
                              return QString("HTML");
                            }
                            

                            Seriously, what html do you need? The full document, an excerpt? Conversion of one document to another? A really naive approach could be:

                            QString getHTML(QVariant data){
                              return QString("<div>"+data.toString()+"</div>");
                            }
                            

                            This returns a valid HTML string that is wrapped by an HTML tag. Not a full document, but usable in a larger document producing construct.

                            C++ is a perfectly valid school of magic.

                            1 Reply Last reply
                            3
                            • M Offline
                              M Offline
                              Mikeeeeee
                              wrote on last edited by
                              #14

                              I have .docx file.
                              I get simple text from .docx:

                              QString ResumeFileName ("");
                                  ResumeFileName = QFileDialog::getOpenFileName(0, "Text ", "", "*.doc *.docx *.rtf");
                                  ResumeFileName.replace(QRegExp("[/]"), "\\");
                                  qDebug()<<ResumeFileName;
                                  if (ResumeFileName != "")
                                  {
                                      QAxObject   wordApplication("Word.Application");
                                      QAxObject *documents = wordApplication.querySubObject("Documents");
                                      QAxObject *document = documents->querySubObject("Open(const QString&, bool)", ResumeFileName, true);
                                      QAxObject *words = document->querySubObject("Words");
                                      QString TextResume;
                                      QString HTMLResume;
                                      int countWord = words->dynamicCall("Count()").toInt();
                                      for (int a = 1; a <= countWord; a++){
                                          TextResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").toString());
                                          HTMLResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").SomethingFfunction);
                                      }
                                      document->dynamicCall("Close (boolean)", false);
                                      TextResume.replace(QRegExp("[\r]"), "\r\n"); 
                                      qDebug()<<TextResume;
                              

                              But I also need text with formatting and pictures

                              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