如何防止QLabel不必要的自动换行?

时间:2015-07-21 09:24:08

标签: qt qt4 qlabel

我需要使用具有以下要求的QLabel显示文本:

  1. 自动换行
  2. 根据文本的长度从小宽度扩展到全宽,而标签只需一行
  3. 标签占据多行时始终为全宽
  4. 标签的背景填充了一些颜色
  5. 我尝试将带有sizePolicy(Preferred,Preferred)的QLabel和带有sizePolicy(Expanding,Minimum)的QSpacerItem放入QHBoxLayout。

    layout

    我希望文字包裹在到达右侧之前。

    expect

    但我知道文本在到达右侧之前就被包裹了。

    result

    如何防止这种不必要的自动换行?

    复制代码

    注意

    1. 如果我没有将间隔符放在HBox中,则符合要求1和3,但是2(文本不存在的区域填充了背景颜色。在这个时候,我不希望出现这种情况。)
    2. 如果我禁用自动换行,则符合要求2,但是符合要求。
    3. enter image description here enter image description here

      相关问题

      这个问题是关于类似的问题,但没有布局。

2 个答案:

答案 0 :(得分:2)

  1. 这可以通过仅在需要时设置标签的wordWrap来解决。要触发标签尺寸更改,您可以通过QLabel补充来制作自定义标签。以下是一个例子。
  2. 将文本添加到标签时。最初使用自动换行假,它会扩展直到达到帧大小。如果它超过帧大小,则自动换行设置为true。

    1. mylabel.h

      #ifndef MYLABEL_H
      #define MYLABEL_H
      
      #include <QLabel>
      
      class MyLabel : public QLabel
      {
           Q_OBJECT
      public:
         explicit MyLabel();
          ~MyLabel();
      
      signals:
          void labelSizeChange();
      protected slots:
          void resizeEvent(QResizeEvent *);
      
      };
      
      #endif // MYLABEL_H
      
    2. mylabel.cpp

      #include "mylabel.h"
      
      MyLabel::MyLabel():QLabel()
      {
      }
      
      MyLabel::~MyLabel()
      {
      }
      
      void MyLabel::resizeEvent(QResizeEvent *)
      {
          emit labelSizeChange();
      }
      
    3. mainwindow.h

          #ifndef MAINWINDOW_H
          #define MAINWINDOW_H
      
          #include <QMainWindow>
          #include <QtCore>
          #include <mylabel.h>
      
      
          namespace Ui {
          class MainWindow;
          }
      
          class MainWindow : public QMainWindow
          {
              Q_OBJECT
      
          public:
              explicit MainWindow(QWidget *parent = 0);
              ~MainWindow();
      
          private slots:
      
              void lableSettings();
              void on_pbShort_clicked();
              void on_pbMedium_clicked();
              void on_pbLong_clicked();
      
              void addTextToLabel(QString text);
          private:
              Ui::MainWindow *ui;
      
              MyLabel myLabel;
      
              QString lorem;
      
          };
      
           #endif // MAINWINDOW_H
      
    4. mainwindow.cpp

      #include "mainwindow.h"
          #include "ui_mainwindow.h"
      
      
          MainWindow::MainWindow(QWidget *parent) :
              QMainWindow(parent),
              ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
      
              ui->horizontalLayout->addWidget(&myLabel);
              ui->horizontalLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
      
              myLabel.setStyleSheet("Background-color:black;color:white");
              myLabel.setWordWrap(false);
              myLabel.setMinimumWidth(0);
              myLabel.setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
      
              connect(&myLabel,SIGNAL(labelSizeChange()),this,SLOT(lableSettings()));
      
              lorem ="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
          }
      
          MainWindow::~MainWindow()
          {
              delete ui;
          }
      
      
          void MainWindow::addTextToLabel(QString text)
          {
              myLabel.setWordWrap(false);
              myLabel.setMinimumWidth(0);
              myLabel.setText(text);
      
          }
      
          void MainWindow::lableSettings()
          {
      
              if(myLabel.width()> ui->frame->width()-20)
              {
                  myLabel.setWordWrap(true);
                  myLabel.setMinimumWidth(ui->frame->width()-20);
               // Note the value 20 depends on the layout spacing 
               //between the Horizontal layout and the frame. 
               //If this value is less. The whole windo will start resizing.
              }
          }
      
          void MainWindow::on_pbShort_clicked()
          {
               addTextToLabel(lorem.left(15));
          }
      
          void MainWindow::on_pbMedium_clicked()
          {
              addTextToLabel(lorem.left(150));
          }
      
          void MainWindow::on_pbLong_clicked()
          {
              addTextToLabel(lorem);
          }
      
    5. GUI布局:框架内的Horizo​​ntalLayout。

      enter image description here

答案 1 :(得分:0)

制作聊天应用程序时遇到了同样的问题。受Techneaz的答案启发,我发现使用QFontMetrics是一种更干净的计算文本宽度的方法。

因此,如果计算出的文本宽度加上一些填充小于期望的最大宽度,则将标签的固定宽度设置为“计算出的文本宽度加上一些填充”,否则将其设置为期望的最大宽度

这是我在pyqt中的代码:

class TextBubbleView(BubbleView):

    PADDING = 18
    MAX_WIDTH = 400

    def __init__(self, msg: Message):
        super().__init__(msg)
        self.setWordWrap(True)
        fm = QFontMetrics(self.font())
        width = fm.width(msg.content) + TextBubbleView.PADDING
        if width < TextBubbleView.MAX_WIDTH:
            self.setFixedWidth(width)
        else:
            self.setFixedWidth(TextBubbleView.MAX_WIDTH)
        self.setText(msg.content)

BubbleView只是QLabel的子类。

before

after

对不起,我的英语不好。