QGroupBox如何支持HTML?
How to support HTML for 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
很奇怪,但这就是我现在的想法。谁能告诉我我的方向是否正确?如果是,我该如何更改 class 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;
}
结果:
其实我在其他位置也发现了我的错误。使用此代码,标题应该已经支持富文本。我已经尝试过使用 Qt Creator 并且它有效。我在上面更新了我的解决方案。
当我们设置
时,我需要创建一个支持 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
很奇怪,但这就是我现在的想法。谁能告诉我我的方向是否正确?如果是,我该如何更改 class 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;
}
结果:
其实我在其他位置也发现了我的错误。使用此代码,标题应该已经支持富文本。我已经尝试过使用 Qt Creator 并且它有效。我在上面更新了我的解决方案。