PyQt5-使QCombobox下拉列表悬停



因此,基本上我是PyQt5的新手,我发现PyQt5支持样式表!

所以我只是想到了当我的用户悬停在QCombox上时实现下拉列表。

接受任何答案或建议!

可以吗?

import sys
from PyQt5.QtWidgets import (QWidget, QHBoxLayout,
QComboBox, QApplication)
from PyQt5.QtGui import QIcon

class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
hbox = QHBoxLayout()
combo = QComboBox(self)
combo.addItem('Disk')
combo.setItemIcon(0, QIcon('disk.png'))

combo.addItem('Web')
combo.setItemIcon(1, QIcon('web.png'))
combo.addItem('Computer')
combo.setItemIcon(2, QIcon('computer.png'))
hbox.addWidget(combo)
hbox.setSpacing(20)

self.setContentsMargins(20, 20, 20, 20)
self.setLayout(hbox)
self.setGeometry(300, 300, 250, 180)
self.setWindowTitle('QComboBox')
self.show()

def main():

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

if __name__ == '__main__':
main()

Qt中的样式表不允许以编程方式访问小部件功能(小部件属性除外,但必须小心使用(
因此,如果您认为可以使用样式表在悬停时显示弹出窗口,则无法。

为了做到这一点,您必须对QComboBox进行子类化并重新实现其enterEvent(),否则安装一个事件过滤器。在这两种情况下,都需要调用showPopup():

class Example(QWidget):
def initUI(self):
# ...
combo.installEventFilter(self)
def eventFilter(self, source, event):
if event.type() == QEvent.Enter:
source.showPopup()
return super().eventFilter(source, event)

注意,如果你想过滤其他小部件和不同的事件类型,最好为对象创建一个引用,并检查事件的来源是否确实是你需要的:

class Example(QWidget):
def initUI(self):
# ...
self.combo = QComboBox()
self.combo.installEventFilter(self)
# ...
def eventFilter(self, source, event):
if source == self.combo and event.type() == QEvent.Enter:
source.showPopup()
return super().eventFilter(source, event)

关于样式表的自定义,请参阅自定义QComboBox的示例,但我也强烈建议您研究样式表语法和参考文档。

还要注意的是,每个帖子应该总是问一个问题,如果你有更多不同的问题,请为每个问题创建一个帖子

最新更新