You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt中Touch类发射信号至test类无法接收参数问题

问题原因及解决方法

你的代码存在两个核心问题,导致信号无法被接收:

  1. test类从未被实例化:主函数里只创建了Touch的显示实例window2,但完全没初始化test对象,test里的信号连接逻辑根本没执行。
  2. 信号连接的是错误实例:就算创建test实例,它的__init__里会新建一个独立的Touch对象,和主函数里显示的window2不是同一个,window2发出的信号自然不会被捕获。

修正后的代码

from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class Touch(QMainWindow):
    td = pyqtSignal(str)    
    
    def __init__(self, parent=None):
        super(Touch, self).__init__(parent)
        self.setWindowTitle('Capture Touch Event')
        self.setFixedSize(400, 400)
        self.move(100, 300)               

    def eventFilter(self, obj, event):
        if event.type() == QEvent.TouchBegin:      
            print('touch down')
            self.td.emit('Down_Pass')
            return True
            
        elif event.type() == QEvent.TouchEnd:          
            print('touch up')
            self.td.emit('Up_Pass')
            return True

        return super(Touch, self).eventFilter(obj, event)  

class test():       
    def abc(self, x):
        print(x)                   
        print("1236456")

if __name__ == '__main__':  
    app = QtWidgets.QApplication([])
    window2 = Touch()       
    window2.setAttribute(Qt.WA_AcceptTouchEvents, True)    
    window2.installEventFilter(window2)
    
    # 关键:创建test实例,将显示中的window2的信号连接到test的回调
    test_obj = test()
    window2.td.connect(test_obj.abc)
    
    window2.show() 
    sys.exit(app.exec_())

说明

  1. 在主函数里创建test实例test_obj,并直接将正在显示的window2的td信号连接到test_obj.abc方法,确保信号从正确的实例发出并被接收。
  2. 移除了test类内多余的Touch实例创建,让test专注于信号回调逻辑。

内容的提问来源于stack exchange,提问作者acs123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:27:20