重写QWidget的paintEvent函数,自定义类如下:
#define MIN_FONT_SIZE 1
#define MAX_FONT_SIZE 1000
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
void setText(const QString &str);
protected:
void paintEvent(QPaintEvent *event);
QString string;
};
实现部分:
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
}
void MyWidget::setText(const QString &str)
{
if(string != str)
{
string = str;
update();
}
}
void MyWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
if(string.isEmpty())
return;
QRectF rectangle(0, 0, this->width(), this->height());
QRectF boundingRect;
QTextOption o;
o.setWrapMode(QTextOption::WrapAnywhere);
o.setAlignment(Qt::AlignVCenter);
QPainter painter(this);
QFont font = painter.font();
font.setFamily("楷体"); //字体
for(int i = MIN_FONT_SIZE; i < MAX_FONT_SIZE; i++)
{
font.setPixelSize(i);
painter.setFont(font);
boundingRect = painter.boundingRect(rectangle, string, o);
if(!rectangle.contains(boundingRect))
{
font.setPixelSize((i - 1) == 0 ? MIN_FONT_SIZE : (i - 1));
painter.setFont(font);
break;
}
}
painter.drawText(rectangle, string, o);
// QPen pen = painter.pen();
// pen.setStyle(Qt::DotLine);
// pen.setColor(Qt::red);
// painter.setPen(pen);
// painter.drawRect(boundingRect.adjusted(0, 0, -pen.width(), -pen.width()));
// pen.setStyle(Qt::DashLine);
// pen.setColor(Qt::blue);
// painter.setPen(pen);
// painter.drawRect(rectangle.adjusted(0, 0, -pen.width(), -pen.width()));
}
可能效率不太高,基本能用,效果如下: