QCheckBox自动换行

10

是否有一种方法可以像QLabel一样包装QCheckBox中的文本?

label = QLabel( QString.fromUtf8('long text in here'))
label.setWordWrap(True)

我尝试了\n,这可以添加换行符,但如果我调整窗口大小,它并不是动态的。


看起来在 https://bugreports.qt-project.org/browse/QTBUG-5370 上有一个功能请求。该问题尚未关闭,因此很可能该功能尚未实现。 - sashoalm
1
请查看这个问题,它至少有两个选项可供您使用。 - Denis Malinovsky
5个回答

9
似乎这个问题在 https://bugreports.qt.io/browse/QTBUG-5370 上有一个功能请求。

该问题尚未关闭,因此可能尚未实施此功能。这意味着目前无法将自动换行添加到 QCheckBox。

您可以尝试各种解决方法,例如使用空文本 QCheckBox 和右侧的 QLabel,或尝试将较短的文本放入复选框中,并在其下方放置长说明标签。


另一个解决方案是只使用工具提示。 工具提示的目的是进行详细描述。不幸的是,许多用户不熟悉查找工具提示。 - Nicholas Miller
可以通过在自定义的QCheckBox子类中处理resizeEvent并在那里执行必要的换行来以清晰的方式实现此操作。有关详细信息,请参见我的答案。 - emkey08

3

您可以开发QtDesigner的自定义小部件以图形方式(或不图形)使用此功能。

CheckBoxWordWrap(在调整大小时动态):

CheckBoxWordWrap

在QtDesigner中:

CheckBoxWordWrap plugin
CheckBoxWordWrap properties

你也可以使用类并对其进行修改,如果行为不完全符合您的要求。

0

"这是我的双\n行复选框"。现在你有了双行复选框

Double Line Checkbox


0

很遗憾,这个问题没有简单的解决方案。我们必须自己实现。

LineWrappedRadioButton 类的完整实现已经在 这个相关答案 中提供。你可以通过从那里继承 QCheckBox 而不是 QRadioButton 来轻松地将这段代码转换成 LineWrappedCheckBox 类。

像这样使用:

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    LineWrappedCheckBox checkBox("Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua.");
    checkBox.show();
    return app.exec();
}

这将产生以下结果:

LineWrappedCheckBox screenshot


0
回答晚了10年,但我通过使用自定义小部件解决了这个问题。
class custom_checkbox(QCheckBox):
    def __init__(self, text):
        super().__init__()

        layout = QHBoxLayout()

        text_label = QLabel()
        text_label.setText(text)
        text_label.setWordWrap(True)
    
        layout.addWidget(text_label)
  
        self.setLayout(layout)

        self.mouse_inside = False
    def enterEvent(self, event):
        self.mouse_inside = True
    def leaveEvent(self, event):
        self.mouse_inside = True
    def mousePressEvent(self, event):
        if self.mouse_inside:
            self.setChecked(not self.isChecked())

你需要为自己创建的复选框小部件设置自定义CSS,否则它会显示不正常。
这是我为名为checkbox_widget的复选框小部件使用的CSS。
checkbox_widget.setStyleSheet(f"""
                        QCheckBox {{
                        background-color: {color};
                        color: white;
                        padding: 30px;
                        border-radius: 5px;
                        border : none
                        }}  
                        QCheckBox::indicator {{
                        image: none;
                        }}
                        QCheckBox::indicator:checked {{
                        image: none;
                        }}
                        QLabel {{
                        background-color : {color};
                        padding: 20px;
                        font-size: 20px
                        }}
                        """)

如果你想要指示器,那就移除指示器的CSS,并将QLabel的padding-left值改为大约40像素,应该就能正常工作了。
checkbox_widget.setStyleSheet(f"""
                       QCheckBox {{
                       background-color: {color};
                       color: white;
                       padding: 30px;
                       border-radius: 5px;
                       }}  
                       QCheckBox::indicator {{
                       subcontrol-position:left;
                       background-color: {color_for_unchecked_indicator};
                       border-radius: 4px;
                       }}
                       QCheckBox::indicator:checked {{
                       background-color: {color_for_checked_indicator};
                       }}
                       QLabel {{
                       padding-left: 40px;
                       }}
                       """)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接