我需要使用具有以下要求的QLabel显示文本:
>自动换行
>根据文本的长度从小宽度扩展到全宽,而标签只占一行
>标签占用多行时始终为全宽
>标签的背景充满了一些颜色
我尝试将带有sizePolicy(Preferred,Preferred)的QLabel和带有sizePolicy(Expanding,Minimum)的QSpacerItem放入QHBoxLayout.
我希望文本在到达右侧之前不会被包裹.
但是我知道文本在到达右侧之前被包裹了.
如何防止这种不必要的自动换行?
复制代码
> Here
注意
>如果我没有将间隔符放在HBox中,那么符合要求1和3,但是2(文本不存在的区域填充了背景颜色.在这个时候,我不想要这种行为).
>如果我禁用自动换行,则符合要求2,但为1.
相关问题
> Why does QLabel prematurely wrap?
这个问题是关于类似的问题,但没有布局.
最佳答案 >这可以通过仅在需要时设置标签的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.