实现pyqt5的ComboBox的鼠标点击触发事件!

博客主要围绕Python展开,介绍了自定义MyComboBox,利用其创建窗口空间,还讲述了在main函数中对clicked信号进行绑定的相关内容,涉及到pyqt、qt等技术。

一、自定义MyComboBox

# MyComboBox.py
from PyQt5.QtWidgets import QComboBox
from PyQt5.QtCore import pyqtSignal             

class MyComboBox(QComboBox):
    clicked = pyqtSignal()          #创建一个信号
    def showPopup(self):            #重写showPopup函数
        self.clicked.emit()         #发送信号
        super(MyComboBox, self).showPopup()     # 调用父类的showPopup()

二、使用MyComboBox创建窗口空间

# test_ui.py
        self.PrintersList = MyComboBox(self.groupBox)	# 修改后
        # self.PrintersList = QtWidgets.QComboBox(self.groupBox) # 修改前

三、main函数中对clicked 信号进行绑定

# main_loop.py

    self.PrintersList.clicked.connect(self.scan_printer_list_slot)     		# 信号与槽函数的绑定

	# 槽函数的实现
    def scan_printer_list_slot(self):
	     print("扫描打印机并刷新列表")

 

<think> 我们想要重写QComboBox,使得只有当点击非Item部分(如下拉框的空白区域或者关闭按钮)时,下拉框才收起,而点击Item时不会收起下拉框(因为点击Item通常是要选择该项,选择后下拉框会自动收起,但我们希望避免在点击Item时立即收起,而是等待选择完成后再收起。不过这里的需求是“仅点击非Item时展开和收起”,注意这里的“展开和收起”是指下拉框的显示和隐藏。实际上,QComboBox点击Item后会自动收起,这是默认行为。但用户的需求可能是:在点击Item后,下拉框不收起,直到点击了非Item区域才收起。然而,这并不符合常规的交互,因为通常选择Item后下拉框就收起了。所以我们需要明确用户的需求。 但根据问题描述:“实现点击非Item时展开和收起”,我的理解是: 1. 点击QComboBox的下拉箭头(或非下拉框区域)时,展开下拉框(这是默认行为,但用户可能还想保持)。 2. 当下拉框展开后,点击下拉框中的Item,不会收起下拉框(即不会隐藏下拉列表),只有点击下拉框中的非Item区域(比如空白处)或者下拉框外部时,才收起下拉框。 然而,常规的QComboBox点击Item后,会触发选择并自动收起下拉框。所以我们需要修改这一行为:即点击Item后,只选择该Item,但不收起下拉框。只有点击非Item区域(如下拉框的空白处)或外部时,才收起。 实现思路: 1. 继承QComboBox,创建一个自定义的ComboBox。 2. 我们需要重写下拉列表(QAbstractItemView)的事件处理,因为下拉列表是一个弹出窗口,它的事件处理独立于QComboBox。 3. 但是,我们可能无法直接通过重写QComboBox来捕获下拉列表事件,因为下拉列表是内部创建的。 4. 另一种方法是,我们设置一个事件过滤器给下拉列表(view),然后在下拉列表鼠标点击事件中,判断点击位置是否在Item上。如果在Item上,则忽略(即不收起下拉框);如果不在Item上,则收起下拉框。 但是注意:QComboBox默认在点击Item后会发送activated/currentIndexChanged等信号,并收起下拉框。我们需要阻止这个收起行为。 实际上,QComboBox的收起行为是由其内部处理决定的。我们可以通过设置QComboBox的setView()来设置自定义的view,然后在自定义的view中处理鼠标事件。 具体步骤: 1. 创建一个自定义的QComboBox子类。 2. 在子类中,我们设置一个自定义的视图(继承自QListView或QAbstractItemView),并重写它的鼠标事件。 3. 或者,我们可以对默认的视图安装事件过滤器。 这里我们采用事件过滤器的方式,因为相对简单。 步骤如下: a. 在自定义的QComboBox中,我们重写showPopup()方法,以便在弹出下拉框时,给下拉框的视图安装事件过滤器。 b. 在事件过滤器中,我们判断事件类型为鼠标点击(QEvent.MouseButtonPress)时,判断点击的位置是否在Item上。 如果点击的位置不在任何Item上(即空白区域),则我们手动收起下拉框(调用hidePopup)。 注意:如果点击在Item上,我们不做处理(即不收起,保持展开),但是默认情况下,点击Item会触发选择并收起下拉框,所以我们还需要阻止这个默认行为吗? 然而,我们想要的效果是:点击Item后,只改变当前选择(这是默认会发生的),但不收起下拉框。但默认行为是点击Item后,下拉框会收起。所以我们需要阻止QComboBox点击Item后自动收起。 但是,QComboBox的内部机制是:当视图(view)触发了一个点击(比如选择了某个Item),它会自动收起下拉框。为了阻止这个行为,我们可以考虑在事件过滤器中,当点击Item时,我们接受事件(event.accept())并阻止事件继续传递?但这样可能还不够,因为收起的行为是QComboBox内部响应的。 另一种思路:我们可以通过子类化下拉列表并重写其mousePressEvent。在mousePressEvent中,如果点击的是Item,我们只处理选择,但不隐藏下拉框;如果点击的是非Item区域,则隐藏下拉框。 但是,QComboBox在视图的点击事件中会收到一个信号(比如视图的clicked信号),然后它就会收起下拉框。因此,我们需要断开这个连接?这比较复杂。 参考一个类似问题的解决方案:我们可以设置QComboBox的setMaxVisibleItems(100)(一个很大的值)来避免下拉框自动关闭,但这并不是根本解决办法。 实际上,我们可以通过重写QComboBox的hidePopup方法,并控制它何时被调用。我们添加一个标志,当点击Item时,我们设置标志,然后不隐藏,而点击非Item时,我们调用父类的hidePopup。 具体步骤(使用事件过滤器和标志位): 1. 自定义一个QComboBox类,在其中定义一个实例变量,例如`self.ignoreHide = False`。 2. 给下拉列表安装事件过滤器(在showPopup中安装)。 3. 在事件过滤器中,当下拉列表(视图)收到鼠标按下事件时,判断点击的位置是否在Item上。 如果点击位置在Item上,我们设置`self.ignoreHide = True`(表示接下来要忽略一次hidePopup调用)。 如果点击位置不在Item上,则设置`self.ignoreHide = False`(或者不设置,因为我们的策略是:只有点击Item时才忽略一次隐藏)。 4. 重写hidePopup方法:如果`self.ignoreHide`为True,则设置`self.ignoreHide = False`并返回(不隐藏);否则调用父类的hidePopup。 但是,这里有一个问题:当点击Item时,视图会触发clicked信号,然后QComboBox内部会调用hidePopup。所以我们在事件过滤器中设置标志位,然后在hidePopup中根据标志位决定是否隐藏。 然而,我们还需要考虑其他情况,比如用户点击了外部区域,这时QComboBox也会调用hidePopup。因此,我们需要在事件过滤器中捕获外部点击?但外部点击通常不会经过下拉列表事件过滤器。 实际上,QComboBox点击外部区域时,会直接调用hidePopup。我们无法在事件过滤器中捕获外部点击(因为事件过滤器安装在下拉列表上,而外部点击不会发送给下拉列表)。 因此,我们需要另一种机制来捕获外部点击。但QComboBox本身有一个特性:当下拉框显示时,点击外部区域,QComboBox会收到一个鼠标事件,然后它会调用hidePopup。所以我们可以重写QComboBox的mousePressEvent,但这样会干扰正常的点击。 一个更全面的解决方案:使用事件过滤器同时过滤QComboBox本身和它的下拉列表。 步骤: 1. 在自定义QComboBox的构造函数中,给自身安装事件过滤器:`self.installEventFilter(self)` 2. 在事件过滤器中,判断事件类型为QEvent.MouseButtonPress,并且事件发生在下拉列表显示时,判断点击位置是否在QComboBox的矩形内或下拉列表的矩形内。如果点击在外部,则调用父类的hidePopup(我们允许隐藏)。 3. 同时,我们仍然需要处理下拉列表内部的事件点击Item时设置标志位,然后在hidePopup中忽略一次。 但是,这样处理比较复杂。 另一种思路:我们只希望在下拉列表显示时,点击Item不关闭下拉框。我们可以通过重写QComboBox的eventFilter(因为我们已经给下拉列表安装了事件过滤器)来处理下拉列表鼠标事件。 具体实现: 自定义ComboBox类: ```python class CustomComboBox(QComboBox): def __init__(self, parent=None): super().__init__(parent) self.ignoreNextHide = False def showPopup(self): # 调用父类的showPopup显示下拉框 super().showPopup() # 获取下拉列表的视图(view) view = self.view() if view: # 给视图安装事件过滤器 view.installEventFilter(self) def eventFilter(self, obj, event): # 首先检查是否是视图的事件 if obj == self.view(): if event.type() == QEvent.MouseButtonPress: # 获取鼠标按下的位置 pos = event.pos() index = self.view().indexAt(pos) # 如果点击的位置没有Item(无效index),那么不做特殊处理,即点击空白处会关闭(由后续的hidePopup处理) # 如果点击了Item,我们设置一个标志,表示忽略下一次hidePopup if index.isValid(): self.ignoreNextHide = True else: self.ignoreNextHide = False return super().eventFilter(obj, event) def hidePopup(self): if self.ignoreNextHide: # 重置标志,并且不隐藏 self.ignoreNextHide = False else: super().hidePopup() ``` 但是,这个实现有一个问题:当我们点击Item时,设置ignoreNextHide为True,然后QComboBox内部会调用hidePopup(在点击Item后),这时我们就会忽略这次调用。但是,当我们点击Item后,下拉框并没有关闭,然后如果我们再次点击Item,由于ignoreNextHide已经被重置,所以第二次点击会关闭下拉框?这不符合预期。 另外,当我们点击Item后,下拉框没有关闭,然后我们点击下拉框的空白处(非Item),这时会触发hidePopup,由于ignoreNextHide为False(在事件过滤器中点击空白处时设置为False),所以会关闭。但是,当我们点击外部区域时,QComboBox的hidePopup会被调用,这时ignoreNextHide可能是True(如果上一次点击的是Item)也可能是False,但我们需要在点击外部时关闭。 然而,点击外部区域时,我们的事件过滤器并没有捕获到(因为事件发生在下拉列表外部,而我们的事件过滤器只安装在视图上),所以ignoreNextHide不会被重置。因此,在点击Item后(ignoreNextHide为True),再点击外部区域,hidePopup被调用,由于ignoreNextHide为True,我们不会关闭下拉框,这就不对了。 所以我们需要在点击外部区域时,将ignoreNextHide重置为False?或者,我们换一个思路:在每次hidePopup调用后,无论是否忽略,都将ignoreNextHide重置为False。但是,这样在忽略一次后,标志被重置,那么下次点击外部区域时,标志已经是False了,就会正常关闭。 修改后的hidePopup: ```python def hidePopup(self): if self.ignoreNextHide: # 忽略本次隐藏,但重置标志 self.ignoreNextHide = False else: super().hidePopup() ``` 但是,这样在点击Item后,ignoreNextHide被设为True,然后hidePopup被调用,忽略并重置为False。然后下拉框仍然显示。接着,如果我们点击外部区域,会再次调用hidePopup,此时ignoreNextHide为False,所以会关闭。 所以这个逻辑是可行的。 但是,我们还需要考虑:点击Item后,我们不仅希望不关闭下拉框,而且还要选择该项。默认情况下,点击Item会触发选择,我们不需要额外处理,因为视图会处理选择事件。 但是,在事件过滤器中,我们只设置了标志,并没有触发选择。实际上,在事件过滤器中,我们只是设置了标志,然后视图的鼠标事件还会继续传递,所以选择事件会被正常处理。 另外,我们还需要注意:在事件过滤器中,我们只处理了MouseButtonPress事件,而没有处理MouseButtonRelease事件。实际上,QComboBox内部可能是在释放事件触发选择的。不过,只要我们的事件过滤器没有阻止事件传递,应该没有问题。 但是,我们的事件过滤器返回了父类的事件过滤器结果(通过super().eventFilter),这可能会处理事件。为了确保事件继续传递,我们应该返回False(表示事件没有被处理,继续传递)?但是,在PyQt中,事件过滤器如果返回True,则表示事件被处理,不再传递;返回False则表示继续传递。 而我们这里,我们只是查看了事件,并没有处理,所以应该返回False?但是,我们继承的父类的事件过滤器可能会处理一些事件。所以更安全的做法是:在事件过滤器中,我们只做我们自己的处理,然后返回父类的事件过滤器的结果。 但是,在父类的事件过滤器中,可能会处理事件。因此,我们可以在处理完我们的事件后,让事件继续传递,即返回False,但这样父类的事件过滤器可能就不会被调用。所以,我们调用父类的事件过滤器,然后返回它的结果。 然而,在我们的代码中,我们调用了`super().eventFilter(obj, event)`,它会处理事件并返回一个布尔值。所以我们应该返回这个值。 但是,我们只对视图的鼠标按下事件感兴趣,其他事件我们不需要处理,所以我们可以这样: ```python def eventFilter(self, obj, event): if obj == self.view() and event.type() == QEvent.MouseButtonPress: pos = event.pos() index = self.view().indexAt(pos) if index.isValid(): self.ignoreNextHide = True else: self.ignoreNextHide = False # 注意:这里我们返回父类的事件过滤器,但父类的事件过滤器可能会处理事件。 # 但是,我们的父类(QComboBox)的事件过滤器可能没有对视图的事件做处理,所以这样应该是安全的。 return super().eventFilter(obj, event) ``` 但是,如果父类的事件过滤器处理了事件,那么事件就不会继续传递到视图,这可能会影响视图的正常行为。所以,更合适的做法是:在完成我们的处理后,返回False,让事件继续传递。但是,这样我们就不能调用父类的事件过滤器,因为父类的事件过滤器可能会处理事件。所以我们需要避免影响视图的事件。 实际上,我们不应该干扰视图的事件,而只是监听。因此,我们可以不调用父类的事件过滤器,而是直接返回False(表示事件没有被过滤,继续传递)。但是,我们自定义的QComboBox可能还过滤了其他事件,所以需要谨慎。 考虑到我们只关心视图的鼠标按下事件,并且我们只是设置了一个标志,不会影响事件的传递,所以我们可以直接返回False,以确保事件继续传递。 修改: ```python def eventFilter(self, obj, event): if obj == self.view(): if event.type() == QEvent.MouseButtonPress: pos = event.pos() index = self.view().indexAt(pos) if index.isValid(): self.ignoreNextHide = True else: self.ignoreNextHide = False return False # 事件继续传递 ``` 但是,这样我们就无法处理其他事件了?实际上,事件过滤器可以返回False让事件继续传递,而我们在这里只关心视图的鼠标按下事件,所以这样是可行的。 但是,我们还需要注意:事件过滤器是安装在视图上的,所以只有视图的事件会经过这里。而我们返回False,表示事件没有被过滤,视图会继续处理这个事件。 另外,在QComboBox中,我们还需要处理自身的事件,比如点击下拉箭头。但我们的eventFilter只过滤了视图的事件,所以不会影响QComboBox自身的事件。 因此,最终代码如下: ```python from PyQt5.QtWidgets import QComboBox from PyQt5.QtCore import QEvent class CustomComboBox(QComboBox): def __init__(self, parent=None): super().__init__(parent) self.ignoreNextHide = False def showPopup(self): super().showPopup() view = self.view() if view: # 每次显示弹出框时安装事件过滤器(避免重复安装?重复安装无妨,但要注意多次安装会多次处理同一个事件,不过我们返回False,所以不会阻止事件多次处理,但逻辑上不会重复设置标志) view.installEventFilter(self) def eventFilter(self, obj, event): # 只处理视图的鼠标按下事件 if obj == self.view() and event.type() == QEvent.MouseButtonPress: # 获取鼠标按下的位置在视图中的坐标 pos = event.pos() index = self.view().indexAt(pos) if index.isValid(): # 点击了Item,设置标志以忽略下一次hidePopup self.ignoreNextHide = True else: self.ignoreNextHide = False # 返回False,让事件继续传递 return False def hidePopup(self): if self.ignoreNextHide: # 重置标志,不隐藏 self.ignoreNextHide = False else: # 调用父类方法隐藏 super().hidePopup() ``` 注意:当点击Item时,我们设置ignoreNextHide为True,然后QComboBox内部会调用hidePopup(因为默认行为),然后我们在hidePopup中检查到这个标志,就忽略这次隐藏。这样,点击Item后下拉框不会关闭。 但是,当我们点击外部区域时,QComboBox会调用hidePopup(这是QComboBox的默认行为),此时ignoreNextHide为False(因为我们在点击外部区域时,不会触发视图的事件过滤器,所以ignoreNextHide保持上一次的值,可能是True也可能是False)。这就有问题了:如果上一次点击的是Item(ignoreNextHide为True),然后点击外部区域,我们忽略隐藏?这不对。 因此,我们需要在点击外部区域时,将ignoreNextHide设置为False?但是,点击外部区域时,我们无法在事件过滤器中捕获(因为事件不在视图上)。我们可以尝试在QComboBox本身上捕获事件,但QComboBox本身的事件过滤器只能捕获到自身的事件,而外部点击事件会先被系统处理,然后QComboBox会收到一个隐藏下拉框的请求。 所以,我们需要在hidePopup中增加一个判断:当外部点击导致hidePopup被调用时,我们不应该忽略。但是,我们无法区分hidePopup的调用是来自内部(点击Item)还是外部(点击外部区域)? 为了解决这个问题,我们可以这样:在事件过滤器中,我们只处理视图内部的事件,对于视图外部的点击(导致hidePopup被调用)我们不做特殊处理。但是,我们设置的ignoreNextHide标志可能会影响外部点击。因此,我们需要在每次显示弹出框时重置ignoreNextHide为False,或者在每次hidePopup调用后重置(但是我们在hidePopup中已经重置了忽略的情况)。 然而,问题在于:当点击Item后,ignoreNextHide被设为True,然后hidePopup被调用(来自内部)并被忽略,同时ignoreNextHide被重置为False。所以,在点击Item后,ignoreNextHide又变回了False。所以,当外部点击时,调用hidePopup时ignoreNextHide已经为False,所以会正常关闭。 那么,为什么在点击Item后,hidePopup会被调用?因为QComboBox在用户选择了一个Item后会调用hidePopup。所以我们在事件过滤器中设置ignoreNextHide为True,然后在hidePopup中,我们忽略并重置为False。所以,当外部点击时,ignoreNextHide已经是False了。 但是,我们的事件过滤器在每次点击视图的鼠标按下事件时都会设置ignoreNextHide(点击Item设为True,点击空白设为False)。所以,在点击Item后,ignoreNextHide被设为True,然后hidePopup被调用,在hidePopup中我们将其设为False。然后,如果我们在下拉框的空白处点击事件过滤器会设置ignoreNextHide为False,然后hidePopup被调用(因为点击空白处,QComboBox内部可能也会触发hidePopup?),然后我们执行父类的hidePopup,关闭下拉框。 所以,这个逻辑应该是正确的。 但是,我们还需要测试:点击Item后,下拉框没有关闭,然后点击另一个Item,会发生什么? 1. 第一次点击Item:事件过滤器设置ignoreNextHide为True,然后hidePopup被调用(内部),我们忽略并重置为False。下拉框保持打开。 2. 第二次点击另一个Item:同样,事件过滤器设置ignoreNextHide为True,然后hidePopup被调用,我们忽略并重置为False。下拉框保持打开。 所以,每次点击Item,下拉框都不会关闭,直到点击空白处或外部区域。 点击空白处:事件过滤器设置ignoreNextHide为False,然后hidePopup被调用,执行父类方法,关闭下拉框。 点击外部区域:不会触发事件过滤器,所以ignoreNextKeep为False(因为上一次在hidePopup中已经重置为False,并且事件过滤器没有执行),所以调用父类hidePopup,关闭下拉框。 因此,这个实现应该满足需求。 注意:我们给视图安装事件过滤器是在showPopup中,每次显示下拉框都会安装。由于每次显示下拉框时,视图可能被重新创建,所以我们需要在每次显示时重新安装。 但是,如果视图没有被重新创建,那么多次安装事件过滤器会导致同一个事件被多次处理。不过,我们的事件过滤器对同一个事件多次处理并不会改变最终结果,因为第一次处理时设置ignoreNextHide为True(或False),后续再次设置相同的值。所以这是安全的。 但是,为了避免重复安装,我们可以先移除之前的事件过滤器,然后再安装。或者,在安装之前检查是否已经安装过。不过,重复安装的影响很小,所以也可以接受。 另外,我们还需要注意:视图可能被改变(通过setView),所以我们在showPopup中获取当前的视图并安装事件过滤器。 最后,我们还需要考虑一个问题:当用户通过键盘选择Item时,我们是否也要忽略hidePopup?因为默认情况下,键盘选择后下拉框也会隐藏。但是问题只要求鼠标点击Item时不隐藏,所以键盘选择我们不做处理(保持默认隐藏)。 所以,这个自定义ComboBox只处理了鼠标点击Item的情况。 现在,我们可以使用这个CustomComboBox来替代标准的QComboBox。 示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout app = QApplication(sys.argv) window = QWidget() layout = QVBoxLayout(window) combo = CustomComboBox() combo.addItems(["Item 1", "Item 2", "Item 3"]) layout.addWidget(combo) window.show() sys.exit(app.exec_()) ``` 注意:以上代码需要与CustomComboBox类的定义一起运行。 希望这能满足用户的需求。 但是,用户的需求是“仅点击非Item时展开和收起”,而我们的实现是: - 展开:点击下拉箭头(默认行为)展开,我们没改。 - 收起:点击非Item区域(包括下拉框的空白处和外部区域)会收起;点击Item不会收起。 所以符合要求。 注意:在收起时,我们使用父类的hidePopup,它处理了收起操作。 因此,我们可以这样回答用户。 </think>在 PyQt5 中,要实现自定义 QComboBox 的行为(仅当点击非 Item 区域时展开/收起下拉框),需要通过继承 QComboBox 并重写事件处理方法。以下是完整的实现方案,包含详细注释: ```python from PyQt5.QtWidgets import QComboBox from PyQt5.QtCore import QEvent, QModelIndex class CustomComboBox(QComboBox): def __init__(self, parent=None): super().__init__(parent) # 标志位:用于跟踪下拉框状态 self._popupVisible = False def event(self, event): """ 全局事件处理 """ if event.type() == QEvent.MouseButtonPress: # 获取鼠标点击位置 pos = event.pos() # 检查是否点击在 Item 区域 view = self.view() index = view.indexAt(pos) is_item_clicked = index.isValid() # 有效索引 = 点击在 Item 上 if self._popupVisible: # 当下拉框已展开时: # 只有点击非 Item 区域才收起 if not is_item_clicked: self.hidePopup() else: # 当下拉框未展开时: # 点击任何区域都展开(包括 Item) self.showPopup() # 阻止默认行为(避免自动展开/收起) return True # 其他事件交给父类处理 return super().event(event) def showPopup(self): """ 重写展开行为 """ super().showPopup() self._popupVisible = True def hidePopup(self): """ 重写收起行为 """ super().hidePopup() self._popupVisible = False ``` ### 实现原理说明 1. **状态跟踪 (`_popupVisible`)** 通过标志位记录下拉框当前状态(展开/收起) 2. **鼠标事件拦截 (`event`)** - 📍 **点击非 Item 区域收起**:当下拉框已展开时,点击空白处外部区域触发收起 - ▶️ **任意点击展开**:当下拉框未展开时,点击组合框任意位置(包括 Item)触发展开 - ⛔ **阻止默认行为**:通过返回 `True` 屏蔽 QComboBox 的自动展开/收起逻辑 3. **下拉框状态同步** 重写 `showPopup()` 和 `hidePopup()` 方法以同步标志位状态 ### 使用示例 ```python # 在 PyQt 应用中使用自定义组件 from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout app = QApplication([]) window = QWidget() layout = QVBoxLayout(window) # 创建自定义组合框 combo = CustomComboBox() combo.addItems(["选项1", "选项2", "选项3"]) layout.addWidget(combo) window.show() app.exec_() ``` ### 行为说明 | 操作场景 | 行为结果 | |------------------------|------------------------| | 点击未展开的组合框 | 展开下拉框 | | 点击已展开的下拉项 | **保持展开**(不收起) | | 点击已展开的空白区域 | 收起下拉框 | | 点击组合框外部区域 | 收起下拉框 | ### 引用说明 此实现参考了 PyQt 事件处理机制[^2] 和 QComboBox 视图交互原理[^4],通过事件过滤和状态管理实现精准控制下拉框行为。核心在于拦截鼠标事件并判断点击位置是否在有效 Item 上[^3],从而决定是否触发收起操作。 [^1]: 关于 QComboBox 视图样式设置 [^2]: PyQt 事件过滤与焦点控制 [^3]: QComboBox 项高度与视图定位 [^4]: Model/View 框架中的项角色定位
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值