Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在QComboBox中截获鼠标信号_Python_Python 3.x_Pyqt_Pyqt5_Qcombobox - Fatal编程技术网

Python 如何在QComboBox中截获鼠标信号

Python 如何在QComboBox中截获鼠标信号,python,python-3.x,pyqt,pyqt5,qcombobox,Python,Python 3.x,Pyqt,Pyqt5,Qcombobox,我在QDialog小部件上放置了一个自定义组合框,我无法捕捉任何鼠标信号。我将QCOMBOX细分为两个截获QCOMBOX未提供的信号的子类:LostFocusEvent和mouseDobleClickEvent。LostFocusEvent工作正常,但组合没有触发鼠标事件。我需要三个信号的组合框,只有一个合适的是提供 我尝试设置combo.grabMouse(),忽略文档警告,然后combo.doubleClicked开始工作,但是通过信号连接的所有其他小部件开始运行不稳定。 还尝试了combo

我在QDialog小部件上放置了一个自定义组合框,我无法捕捉任何鼠标信号。我将QCOMBOX细分为两个截获QCOMBOX未提供的信号的子类:LostFocusEvent和mouseDobleClickEvent。LostFocusEvent工作正常,但组合没有触发鼠标事件。我需要三个信号的组合框,只有一个合适的是提供

我尝试设置combo.grabMouse(),忽略文档警告,然后combo.doubleClicked开始工作,但是通过信号连接的所有其他小部件开始运行不稳定。 还尝试了combo.view().doubleClick.connect,结果类似。我还尝试了其他类似结果的鼠标事件(新闻发布等) 最后,我尝试在comboBox子类中使用event而不是QMouseEvent,但它被focusOutEvent插槽截获。 QPushButtons上的鼠标事件工作,包括双击QTableView小部件 使用Windows8Python3.7PyQT5

`class Agreement(QDialog):
    def __init__(self,db, address, parent=None):
        super().__init__(parent= None)
        self.parent = parent
.......................................

    def setUi(self):
    .....................................
        self.comboSupplier = ComboFocus.FocusCombo(self)
        self.comboSupplier.setMaximumSize(220,30)
        self.comboSupplier.setEditable(True)
        #self.comboSupplier.grabMouse()
        self.comboSupplier.activated.connect(self.supplierChange)
        self.comboSupplier.focusLost.connect(self.supplierFocusLost)
        self.comboSupplier.doubleClicked.connect(self.editContact)
    ...........................................

     def supplierChange(self):
        try:
            row = self.comboSupplier.currentIndex()
            idx = self.comboSupplier.model().index(row,0)
            self.supplierId = self.comboSupplier.model().data(idx)
            self.agreementTitle[0] = self.comboSupplier.currentText()
            self.setAgreementTitle()
            self.okToSave[2] = int(self.supplierId)
            self.okSaving()
        except TypeError as err:
            print('supplierChange' + type(err).__name__ + ' ' + err.args[0])

    @pyqtSlot()
    def editContact(self):
        try:
            c = Contacts(self.db,self.comboSupplier.currentText(), 
                APM.OPEN_EDIT_ONE, self.supplierId,parent=self)
            c.show()
            c.exec()
        except Exception as err:
            print(type(err).__name__, err-args)

    @pyqtSlot(ComboFocus.FocusCombo)
    def supplierFocusLost(self, combo):
        try:
            self.setFocusPolicy(Qt.NoFocus)
            name = combo.currentText()
            if combo.findText(name) > -1:
                return
       ........................................

class FocusCombo(QComboBox):
    focusLost = pyqtSignal(QComboBox)
    focusGot = pyqtSignal(QComboBox)
    doubleClicked = pyqtSignal(QComboBox)

    def __init__(self, parent = None):
        super().__init__(parent)
        self.parent = parent

    def mouseDoubleClickEvent(self,event=QMouseEvent.MouseButtonDblClick):
        print("double click detected")

        self.doubleClicked.emit(self)

    def focusOutEvent(self, event):
        if event.gotFocus():
            self.focusGot.emit(self)

        elif event.lostFocus():
            self.focusLost.emit(self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    cb = FocusCombo()
    cb.show()
    app.exec_()
    sys.exit(app.exec_())

我想双击组合框以打开一个小部件来动态编辑联系人属性。

当您将QLineEdit设置为可编辑时,会添加一个QLineEdit,因此要跟踪您的事件,必须使用eventFilter:

从PyQt5导入QtCore、QtGui、qtwidget
类FocusCombo(qtwidts.QComboBox):
focusLost=QtCore.pyqtSignal(qtwidts.QComboBox)
focusGot=QtCore.pyqtSignal(qtwidts.QComboBox)
双击=QtCore.pyqtSignal(qtwidts.QComboBox)
def setEditable(自我,可编辑):
super(FocusCombo,self).setEditable(可编辑)
如果self.lineEdit()不是无:
self.lineEdit().installEventFilter(self)
def事件过滤器(自身、obj、事件):
如果obj是self.lineEdit():
如果event.type()==QtCore.QEvent.mousebuttondbl单击:
self.doubleClicked.emit(self)
“”“elif event.type()==QtCore.QEvent.MouseButtonPress:
印刷(“印刷”)
elif event.type()==QtCore.QEvent.MouseButtonRelease:
打印(“发布”)“”“
返回super(FocusCombo,self).eventFilter(obj,event)
def mouseDoubleClickEvent(自身,事件):
打印(“双击检测”)
self.doubleClicked.emit(self)
超级(FocusCombo,self)。鼠标双击事件(event)
def focusOutEvent(自身、事件):
if event.gotFocus():
self.focusGot.emit(self)
elif event.lostFocus():
self.focusLost.emit(self)
超级(FocusCombo,self).focusOutEvent(事件)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=qtwidts.QApplication(sys.argv)
cb=FocusCombo()
cb.补充项目(列表(“abcdef”))
cb.setEditable(真)
cb.双击.连接(打印)
cb.show()
sys.exit(app.exec_())

将QLineEdit设置为可编辑时,会添加QLineEdit,因此要跟踪事件,必须使用eventFilter:

从PyQt5导入QtCore、QtGui、qtwidget
类FocusCombo(qtwidts.QComboBox):
focusLost=QtCore.pyqtSignal(qtwidts.QComboBox)
focusGot=QtCore.pyqtSignal(qtwidts.QComboBox)
双击=QtCore.pyqtSignal(qtwidts.QComboBox)
def setEditable(自我,可编辑):
super(FocusCombo,self).setEditable(可编辑)
如果self.lineEdit()不是无:
self.lineEdit().installEventFilter(self)
def事件过滤器(自身、obj、事件):
如果obj是self.lineEdit():
如果event.type()==QtCore.QEvent.mousebuttondbl单击:
self.doubleClicked.emit(self)
“”“elif event.type()==QtCore.QEvent.MouseButtonPress:
印刷(“印刷”)
elif event.type()==QtCore.QEvent.MouseButtonRelease:
打印(“发布”)“”“
返回super(FocusCombo,self).eventFilter(obj,event)
def mouseDoubleClickEvent(自身,事件):
打印(“双击检测”)
self.doubleClicked.emit(self)
超级(FocusCombo,self)。鼠标双击事件(event)
def focusOutEvent(自身、事件):
if event.gotFocus():
self.focusGot.emit(self)
elif event.lostFocus():
self.focusLost.emit(self)
超级(FocusCombo,self).focusOutEvent(事件)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=qtwidts.QApplication(sys.argv)
cb=FocusCombo()
cb.补充项目(列表(“abcdef”))
cb.setEditable(真)
cb.双击.连接(打印)
cb.show()
sys.exit(app.exec_())

如果我理解您的解释,当将组合框设置为可编辑时,会添加一个新的QLineEdit,这就是放置事件筛选器的原因吗?这是有道理的。我试试看@埃里克:没错,这就是我在回答中指出并实现的关于@eyllanesc答案的另外两个问题:1。--“def setediable”的可编辑性来自哪里?;2.-:它不会发出两次,一次是在“eventFilter”,另一次是在“mouseDobleClickEvent”?@Erick 1)我不理解这个问题。2) MouseeEvent通常由上面的小部件使用,在这种情况下,QLineEdit会使用它,因此不会通知QComboBox。您的答案非常有效。我可以找出editable的来源,关于我发出两次信号的问题,因为我不知道为什么,它只发出一次信号,这就是我想要的。如果我理解你的解释,当将comboBox设置为editable时,会添加一个新的QLineEdit,这就是放置事件过滤器的原因?这是有道理的。我试试看@埃里克:没错,这就是我在回答中指出并实现的关于@eyllanesc答案的另外两个问题:1。--“def setediable”的可编辑性来自哪里?;2.-:它不会发出两次,一次是在“eventFilter”,另一次是在“mouseDobleClickEvent”?@Erick 1)我不理解这个问题。2) MouseeEvent通常由上面的小部件使用,在这种情况下,QLineEdit会使用它,因此不会通知QComboBox。您的答案非常有效。我可以找出editable的来源,以及关于Emit的问题