我需要使用具有以下要求的QLabel显示文本:
我尝试将带有sizePolicy(Preferred,Preferred)的QLabel和带有sizePolicy(Expanding,Minimum)的QSpacerItem放入QHBoxLayout。
我希望文字不包裹在到达右侧之前。
但我知道文本在到达右侧之前就被包裹了。
如何防止这种不必要的自动换行?
这个问题是关于类似的问题,但没有布局。
答案 0 :(得分:2)
wordWrap
来解决。要触发标签尺寸更改,您可以通过QLabel
补充来制作自定义标签。以下是一个例子。 将文本添加到标签时。最初使用自动换行假,它会扩展直到达到帧大小。如果它超过帧大小,则自动换行设置为true。
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
mylabel.cpp
#include "mylabel.h"
MyLabel::MyLabel():QLabel()
{
}
MyLabel::~MyLabel()
{
}
void MyLabel::resizeEvent(QResizeEvent *)
{
emit labelSizeChange();
}
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
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);
}
GUI布局:框架内的HorizontalLayout。
答案 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的子类。
对不起,我的英语不好。