Qt篇——QLabel固定尺寸的情况下让字体大小自适应并自动换行以完整显示
当文字较少时,默认字体大小为16;当文字内容较多时,自动换行并缩小字体。
举例:
字体较少时
字体较多时
思路:
设置自动换行属性 setWordWrap;通过QFontMetrics计算文字字体要多大、显示多少行才不会超过Label的尺寸从而完整显示,然后在每行文字的末尾添加空格让自动换行能够拆分你的字符串。
代码:
void MainFrame::fixedWrapLabel(QLabel *label, QString text) { QFont font = label->font(); QFontMetrics metrics(font); //99999是字体最大数量, 利用QFontMetrics计算出文字的理论宽高 QString elidedText = metrics.elidedText(text, Qt::ElideNone, 99999); //要把label的margin考虑进去 int margin = label->margin(); //设置自动换行 label->setWordWrap(true); int pointSize = font.pointSize(); int row = 1; //如果字体的总长度除以行数比label尺寸宽,则继续缩小字体 while (metrics.width(elidedText) * 1.0 / row > (label->width() - margin * 2) && pointSize > 0) { //计算缩小字体后的文字高度和label的高度的比例,得出当前应该换多少行 //我这里最多只用了3行,根据你的实际情况可以不限制最多行数 if (metrics.height() height() - margin * 2) / 3.0) { row = 3; } else if (metrics.height() height() - margin * 2) / 2.0) { row = 2; } //缩小字体并设置给QFontMetrics font.setPointSize(pointSize--); metrics = QFontMetrics(font); elidedText = metrics.elidedText(text, Qt::ElideNone, label->width()); } int rowSize = elidedText.size() / row; //这里很关键,因为QLabel的setWordWrap自动换行不会分割字符和字母 //所以我们要根据我们计算出来的行数,在每行末尾添加空格,QLabel换行会根据空格进行拆分换行 for (int i = 1; i setFont(font); //显示添加空格来换行的最终文本 label->setText(elidedText); }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。