Как поддерживать HTML для QGroupBox?

Мне нужно создать групповое поле, которое поддерживает текст HTML, когда мы устанавливаем

MyGroupBox *gb = new MyGroupBox();
gb->setTitle("<u> This is underlined text</u>");

Я пробовал некоторые поиски, но безрезультатно. В моей голове сейчас я думаю только о том, чтобы установить стиль для моего группового ящика. Что-то вроде этого:

MyGroupBox.cpp

MyGroupBox::MyGroupBox( QWidget *p_parent ) : QGroupBox( p_parent )
{
  setStyle( &m_style );
}

TitleStyle.hpp

class TitleStyle : public QProxyStyle
{
public:
  TitleStyle() = default;
  virtual void drawComplexControl( ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr ) const override;
};

TitleStyle.cpp

void TitleStyle::drawComplexControl( ComplexControl p_control, const QStyleOptionComplex *p_option, QPainter *p_painter, const QWidget *p_widget ) const
{
  if ( p_control == CC_GroupBox )
  {
     if ( const QStyleOptionGroupBox *title = qstyleoption_cast<const QStyleOptionGroupBox *>( p_option ) )
     {
           QTextDocument td;
           td.setHtml( title->text );
           td.drawContents( p_painter );
     }
  }
  else
  {
     QProxyStyle::drawComplexControl( p_control, p_option, p_painter, p_widget );
  }
}

Это все еще не работает. Я знаю, что мой drawComplexControl странный, но сейчас я думаю именно об этом. Может ли кто-нибудь сказать мне, иду ли я в правильном направлении? Если да, как я могу изменить класс TitleStyle. Если нет, то как я мог сделать?

Решение. Мне потребовалось некоторое время, чтобы найти свою ошибку. С приведенным выше кодом заголовок уже должен поддерживать форматированный текст.

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProxyStyle>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class TitleStyle : public QProxyStyle
{
public:
    TitleStyle() = default;
    virtual void drawComplexControl( ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr ) const override;
};

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    TitleStyle m_style;
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextDocument>

void TitleStyle::drawComplexControl( ComplexControl p_control, const QStyleOptionComplex *p_option, QPainter *p_painter, const QWidget *p_widget ) const
{
  if ( p_control == CC_GroupBox )
  {
     if ( const QStyleOptionGroupBox *title = qstyleoption_cast<const QStyleOptionGroupBox *>( p_option ) )
     {
           QTextDocument td;
           td.setHtml( title->text );
           td.drawContents( p_painter );
     }
  }
  else
  {
     QProxyStyle::drawComplexControl( p_control, p_option, p_painter, p_widget );
  }
}

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
, ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->groupBox->setStyle(&m_style);
    ui->groupBox->setTitle("<b><u>This is an underlined title</u></b>");
}

MainWindow::~MainWindow()
{
    delete ui;
}

Результат:

введите здесь описание изображения


person gnase    schedule 14.11.2019    source источник


Ответы (1)


На самом деле я нашел свою ошибку в других позициях. С этим кодом заголовок уже должен поддерживать форматированный текст. Я пробовал с Qt Creator, и это сработало. Я обновляю свое решение выше.

person gnase    schedule 14.11.2019
comment
добавьте свой ответ в качестве принятого ответа, чтобы он не находился в очереди вопросов без ответов. :) - person cecil merrel aka bringrainfire; 15.11.2019