16

我有一个标签,有时包含没有空格的长文本(计算机中的路径)。

所以 word-wrap 把它包装得很奇怪。

有没有办法让标签的自动换行在单词中间或不仅在空格处中断?

4

4 回答 4

7

这并不优雅但确实有效......
所以说头类有私有:

QLabel *thisLabel;
QString *pathName;
QString *pathNameClean;

当然还有在某个地方定义 thisLabel 。所以如果它这么简单就好了......

thisLabel->setWordWrap(true);

如果且仅当单词有断点(应该避免哪些路径)时,那很好

因此,如果您以后需要它用于 QFile 目的,请将您的实际路径保存在单独的字符串中。然后手动为每个行号定义一个字符,并将空格插入到字符串中......所以我们会说 50 个字符是一个很好的宽度......

    pathNameClean = new QString(pathName);

    int c = pathName->length();

    if( c > 50)
    {
        for(int i = 1; i <= c/50; i++)
        {
            int n = i * 50;
            pathName->insert(n, " ");
        }
    }
    thisLabel->setText(pathName);

Shazam .... 没有原始空格的模拟 WordWrap ...

请记住 pathName 字符串现在仅用于漂亮的 QLabel 目的,并且 pathNameClean 字符串是实际路径。如果您尝试使用空间注入路径打开文件,Qt 程序将崩溃.....

(如果没有简单的类方法,它可能只需要几行代码......为什么解决问题是程序员最好的工具!)

于 2013-03-06T13:08:53.607 回答
6

一种方法是将QTextOption类与QTextDocument而不是 QLabel 一起使用。这让您可以使用QTextOption::WrapModeQTextOption::WrapAtWordBoundaryOrAnywhere应该做你想做的。

于 2012-09-04T11:13:06.027 回答
0

QLabel 与其他换行模式

我恰好在 2021 年也有同样的问题,所以在这里我将与您分享我迄今为止找到的一些最佳答案。

TextWrapAnywhere QLabel

子类QLabel化并实现paintEvent,您可以在其中设置文本对齐TextWrapAnywhere方式drawItemText

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QStyleOption, QVBoxLayout, QWidget, QStyle

class SuperQLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super(SuperQLabel, self).__init__(*args, **kwargs)

        self.textalignment = Qt.AlignLeft | Qt.TextWrapAnywhere
        self.isTextLabel = True
        self.align = None

    def paintEvent(self, event):

        opt = QStyleOption()
        opt.initFrom(self)
        painter = QPainter(self)

        self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self)

        self.style().drawItemText(painter, self.rect(),
                                  self.textalignment, self.palette(), True, self.text())


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setFixedSize(100, 200)

        self.label = QLabel()
        self.label.setWordWrap(True)
        self.label.setText("1111111111111111111111111111")

        self.slabel = SuperQLabel()
        self.slabel.setText("111111111111111111111111111")

        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)

        self.mainlayout = QVBoxLayout()
        self.mainlayout.addWidget(self.label)
        self.mainlayout.addWidget(self.slabel)

        self.centralwidget.setLayout(self.mainlayout)


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

在此处输入图像描述

字符换行而不是空格

根据@ekhumoro 提供的这个答案(在操作的评论中),如果您正在寻找基于逗号的换行,您可以在要换行的字符后插入一个零宽度空格并使用内置的自动换行功能.

这是一个例子:

from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QStyleOption, QStylePainter, QVBoxLayout, QWidget, QStyle


class CommaWrapableQLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super(CommaWrapableQLabel, self).__init__(*args, **kwargs)

    def setWordWrapAtAnychar(self, char):
        newtext = self.text().replace(char, f"{char}\u200b")
        self.setText(newtext)
        self.setWordWrap(True)


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setFixedSize(100, 200)

        self.label = QLabel()
        self.label.setWordWrap(True)
        self.label.setText(
            'Dog,Rabbit,Train,Car,Plane,Cheese,Meat,Door,Window')

        self.slabel = CommaWrapableQLabel()
        self.slabel.setText(
            'Dog,Rabbit,Train,Car,Plane,Cheese,Meat,Door,Window')
        self.slabel.setWordWrapAtAnychar(",")

        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)

        self.mainlayout = QVBoxLayout()
        self.mainlayout.addWidget(self.label)
        self.mainlayout.addWidget(self.slabel)

        self.centralwidget.setLayout(self.mainlayout)


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

在此处输入图像描述

于 2021-08-23T10:54:10.333 回答
-3

在 2020 年,PySide2,它只是:

 tmp = QLabel()
 tmp.setWordWrap(True)    
于 2020-01-25T23:42:05.860 回答