QComboBox setMaxVisible() 不适用于融合风格

Posted

技术标签:

【中文标题】QComboBox setMaxVisible() 不适用于融合风格【英文标题】:QComboBox setMaxVisible() doesn't work with fusion style 【发布时间】:2019-11-03 11:40:15 【问题描述】:

我一直在自学如何使用pythonPyQt5 来制作用户界面。 Fusion 样式看起来非常好,但我注意到当我将该样式应用于应用程序时,QComboBox 命令 setMaxVisibleItems 不再起作用。相反,即使应用了setMaxVisibleItems,融合样式QComboBox 也会一次显示所有项目(或屏幕大小允许的尽可能多的项目)。

我想可能是我使用了错误的命令,所以我删除了融合样式并尝试使用多个不同的值设置最大可见项目。每个都很好,所以我确信它一定是融合风格本身。有没有办法改变融合风格的工作方式或强制它应用setMaxVisibleItems?我在下面包含了一些示例代码。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QComboBox, QPushButton

class Example(QMainWindow):

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

        combo = QComboBox(self)
        counter = 1
        while (counter < 21):
            combo.addItem(str(counter))
            counter = counter + 1
        combo.setMaxVisibleItems(5)

        combo.move(50, 50)

        self.qlabel = QLabel(self)
        self.qlabel.move(50,16)

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

        self.setGeometry(50,50,320,200)
        self.setWindowTitle("QLineEdit Example")
        self.show()

    def onChanged(self, text):
        self.qlabel.setText(text)
        self.qlabel.adjustSize()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    #app.setStyle("fusion")
    ex = Example()
    sys.exit(app.exec_())

应用fusion 样式意味着应用程序一次显示所有20 个项目。注释掉融合样式意味着应用程序一次显示 5 个项目。

【问题讨论】:

【参考方案1】:

maxVisibleItems property 并非受到所有样式的尊重。

注意:对于为 QStyle::SH_ComboBox_Popup 返回 true 的样式(例如 Mac 样式或 Gtk+ 样式)中的不可编辑组合框,此属性将被忽略。

请注意,如果您的组合框是可编辑的,它可能会按预期工作。样式的行为方式是为了能够始终如一地匹配它们试图模仿的原生行为。不知道Fusion不坚持maxVisibleItems的原因。

您始终可以基于 Fusion 创建自己的样式来更改特定行为。一般来说,建议尊重用户对原生样式(或他们配置的样式)的期望,而不是手动设置样式。

【讨论】:

以上是关于QComboBox setMaxVisible() 不适用于融合风格的主要内容,如果未能解决你的问题,请参考以下文章

在QT中怎么隐藏QComboBox的下拉列表并当单击QComboBox的编辑框时,就弹出QListWidget窗口

QCombobox & QListWidget - 检查内容

启动时在 QcomboBox 中显示特定项目

qtablewidget加入QcomboBox控件如何读取内容

QT5-控件-QComboBox

QComboBox样式表:字体图标项高