【问题标题】:How to prevent QLabel from unnecessary word-wrapping?如何防止 QLabel 不必要的自动换行?
【发布时间】:2015-10-10 16:13:57
【问题描述】:

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

  1. 自动换行
  2. 根据文本长度从小宽度扩展到全宽度,同时标签占一行
  3. 标签采用多行时总是全宽
  4. 标签的背景填充了一些颜色

我尝试将带有 sizePolicy (Preferred, Preferred) 的 QLabel 和带有 sizePolicy (Expanding, Minimum) 的 QSpacerItem 放入 QHBoxLayout。

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

但我知道文本在到达右侧之前被换行了。

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

复制代码

注意

  1. 如果我不在HBox中放置spacer,那么满足要求1和3,但是2(文本不存在的区域用背景色填充,此时我不希望这种行为)。李>
  2. 如果我禁用自动换行,则满足要求 2,但满足要求 1。

相关问题

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

【问题讨论】:

  • 无法访问这些数字。可以在这里添加吗?您是否还为 QLabel 设置了最小和最大宽度?
  • 在此示例中添加垫片毫无意义,因为您只需删除垫片并获得所需的行为。您应该描述您的实际用例。您可以使用QBoxLayout::setStretch 来确定为每个扩展项分配多少空间(例如,将标签设置为stretch=4,将间隔设置为1,将给标签全宽的4/5)。如果布局中的其他项目是固定大小的,则展开标签将占用所有可用空间。
  • @techneaz 感谢您发现问题。我修复了链接。
  • @techneaz 我没有设置最小/最大大小,或者我为它们使用默认值,但我认为没关系。因为我不能给出常数值。
  • @PavelStrakhov 谢谢。抱歉,问题可能不清楚。我应该用一些颜色填充标签的背景,但不应该填充文本不存在的区域。所以垫片不是没用的。如果我删除垫片,标签会占用所有空格。其次,在这种情况下,Stretch 不适合我。因为我不想修复为标签提供了多少空间。我想根据文本的长度给空格。

标签: qt qt4 qlabel


【解决方案1】:
  1. 这可以通过仅在需要时设置标签的wordWrap 来解决。要触发标签的大小更改,您可以通过从QLabel 补充来制作自定义标签。下面是一个例子。

将文本添加到标签时。最初使用自动换行错误,它将扩展直到达到帧大小。如果它超过帧大小,则自动换行设置为真。

  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. 主窗口.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. 主窗口.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。

【讨论】:

    【解决方案2】:

    我在制作聊天应用程序时遇到了同样的问题。受 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

    对不起,我的英语不好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2012-08-29
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多