如何对 QComboBox 中的文本执行字母间距?

Posted

技术标签:

【中文标题】如何对 QComboBox 中的文本执行字母间距?【英文标题】:How to perform letter-spacing on text in a QComboBox? 【发布时间】:2020-11-12 22:32:57 【问题描述】:

QWidget 样式表允许在字符之间执行spacing 而不是letter-spacing。在我在 GUI 中设置的组合框中,其currentText 具有或多或少的可读文本,但字体 [MS Shell Dlg 2,8] 的字母间距很糟糕。更改框的最小尺寸不会改变可读性。通过设置样式表来更改 'spacing : 1' 会将文本移动到 cbo 的左侧一点并且不会提高可读性。

是否有执行“字母间距”的选项,使字母之间的距离仅多几个像素?

组合框详细信息是:所有设置默认。几何:

width  = 110
height = 22

测试代码:

#!/usr/bin/python

import sys

from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout,
                             QComboBox, QApplication)

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        self.lbl = QLabel('Ubuntu', self)

        combo = QComboBox(self)
        combo.setFixedSize(100, 22)

        combo.addItem('Species', userData='100')  # text readable here but not when construcuted.
        combo.addItem('Xubuntu', userData=200)
        combo.addItem('Gentoo' , userData=300)

        combo.activated[str].connect(self.onActivated)

        hbox.addWidget(combo)
        hbox.setSpacing(20)

        hbox.addWidget(self.lbl)
 #       self.setContentsMargins(20, 20, 20, 20)
        self.setLayout(hbox)

        self.move(300, 300)
        self.setGeometry(300, 300, 250, 180)
        self.setWindowTitle('QComboBox')
        self.show()

    def onActivated(self, text):

        self.lbl.setText(text)
        self.lbl.adjustSize()
        
        print(self.sender().currentText())
        print(self.sender().currentData())
        sys.stdout.flush()

def main():
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

原始组合框代码可以在这里找到http://zetcode.com/pyqt/qcombobox/。

【问题讨论】:

【参考方案1】:

其实是有的。这些更改不是在 QComboBox 样式表中进行的,而是在字体部分 (Qt.Gui.QFont) 中进行的。所以下面的代码展示了如何改变它。请记住,当框尺寸固定且文本大于其最大尺寸时,将导致不显示完整的文本;而是您必须在组合框中向右滚动。

最后不要忘记“设置”新值,否则不会使用新值。

font = combo.font()                 # getting font metrics 
value1 = font.letterSpacing()       # getting line spacing value 
        
font.setLetterSpacing(QFont.PercentageSpacing, 200)
        
value2 = font.letterSpacing()
        
combo.setFont(font)                 # sets the font for the object
        
print(f'old value1 | new : value2')
sys.stdout.flush()

【讨论】:

考虑到通常不建议使用固定大小,尤其是对于基于文本的小部件:即使您绝对确定用户会使用您的字体'重新选择时,如果 DPI 与您在 your 屏幕上使用的不同,可能会出现一些问题。在任何情况下,请记住 QComboBox 具有 sizeAdjustPolicy() 属性,它允许更多地控制组合如何根据其内容调整大小。

以上是关于如何对 QComboBox 中的文本执行字母间距?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Textview 中的字母间距?

如何将 pyqt5 qcomboBox 中的文本应用于列表值

如何在android的提示文本中设置字母间距

应用字母间距时CSS文本下划线太长?

如何使用 pycairo 创建字母间距属性?

如何在公式编辑器中调整字母间距