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.
  • S Offline
    S Offline
    SGaist
    Lifetime Qt Champion
    wrote on 14 Jan 2019, 13:28 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 15 Jan 2019, 11:11
    1
    • V Offline
      V Offline
      VRonin
      wrote on 14 Jan 2019, 15:26 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 15 Jan 2019, 11:20
      4
      • S SGaist
        14 Jan 2019, 13:28

        Hi,

        What is in your QVariant ?

        M Offline
        M Offline
        Mikeeeeee
        wrote on 15 Jan 2019, 11:11 last edited by
        #4

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

        1 Reply Last reply
        0
        • V VRonin
          14 Jan 2019, 15:26

          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 15 Jan 2019, 11:20 last edited by
          #5

          @VRonin it doesn't compile

          jsulmJ 1 Reply Last reply 15 Jan 2019, 11:32
          1
          • M Mikeeeeee
            15 Jan 2019, 11:20

            @VRonin it doesn't compile

            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on 15 Jan 2019, 11:32 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 15 Jan 2019, 12:00 last edited by
              #7

              Too many errors, not enough files

              1 Reply Last reply
              0
              • V Offline
                V Offline
                VRonin
                wrote on 15 Jan 2019, 12:05 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 15 Jan 2019, 13:24 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
                  • V Offline
                    V Offline
                    VRonin
                    wrote on 15 Jan 2019, 13:39 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 15 Jan 2019, 16:54 last edited by
                      #11

                      this method returns plain text, not HTML

                      M 1 Reply Last reply 15 Jan 2019, 17:15
                      0
                      • M Mikeeeeee
                        15 Jan 2019, 16:54

                        this method returns plain text, not HTML

                        M Offline
                        M Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on 15 Jan 2019, 17:15 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
                        • F Offline
                          F Offline
                          fcarney
                          wrote on 15 Jan 2019, 17:23 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 16 Jan 2019, 08:06 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

                            11/14

                            15 Jan 2019, 16:54

                            • Login

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