`
frymgump
  • 浏览: 5431 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

PyQt中处理信号和槽时遇到的问题和解决方法

Qt 
阅读更多

   昨天在群里一个朋友提出了一个问题,要求在PyQt中click一个pushButton时给它的响应槽传入一个和发射信号的对象属性相关的参数,比如按顺序创建了N个pushButton,把这个次序数i告诉槽函数。

   这本来看上去是一个很简单的问题,可问题就在于QPushButton只有click()等没有任何参数的信号,而自己在写相应的槽的时候无法让其再传入一个自定义的参数。而信号发射时如果不带参数的话槽函数根本无法获知是哪个widget向它发射了信号,自然也无法处理和发射对象相关的属性。

   当然这个问题还得从qt的信号和槽机制说起,槽函数必须和信号的参数是保持一致的,定义信号发射时带了几个参数,槽函数被调用时就会以这几个参数为入参,这是关键的一步。我一直觉得qt自称最大特色的信号和槽机制是个不好的发明,也许它真的很强大,但它的机制很别扭,不容易理解,这会给开发者带来困惑,就像我一样。

   于是就出了这样的问题,折腾了半天终于发现其实可以用事件响应来解决这个问题。Qt中的事件响应函数是widget对象的一个方法,也就是说任何从QWidget继承的类的对象都可以侦听到诸如mousePressEvent()之类的事件。这样一来,自定义一个从QPushButton继承的类,然后在其中重写mousePressEvent()方法,在该方法中emit()一个自定义的信号或者直接执行本来要由槽函数完成的动作即可。完整代码如下:

import sys
from PyQt4 import QtCore, QtGui
class ManyButton(QtGui.QDialog):
    t = ['button1', 'button2', 'button3', 'button4', 'button5']
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.pb = []
        vbox = QtGui.QVBoxLayout()
        for i in range(len(self.t)):
            self.pb.append(MyButton(self.t[i], self))
            QtCore.QObject.connect(self.pb[i],  QtCore.SIGNAL("myslot(str)"), self.myslot)
            vbox.addWidget(self.pb[i])
            self.setLayout(vbox)
        self.resize(250, 150)
    
    def myslot(self, text):
        QtGui.QMessageBox.critical(self, "MessageShow", text, QtGui.QMessageBox.Ok)
        

class MyButton(QtGui.QPushButton):
    def __init__(self, text, parent):
        QtGui.QPushButton.__init__(self, text, parent)
        
    def mouseReleaseEvent(self, event):
        self.emit(QtCore.SIGNAL("myslot(str)"), self.text())

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mb = ManyButton()
    mb.show()
    sys.exit(app.exec_())

 从中可以看出,其实我们通常关注并以为好像是一个函数的信号本身只是一个字符串,比如上面的myslot(str),你必须将这个字符串传入QtCore.SIGNAL()来生成信号。而信号定义的格式必须和emit时所带的参数个数一致,比如

   self.emit(QtCore.SIGNAL("myslot(str, str)"), self.text1(), self.text2())
信号后面就必须跟上两个参数类型str,或者不写也行,但不能写成

   self.emit(QtCore.SIGNAL("myslot(str)"), self.text1(), self.text2()), 这时会报错。
直接写成这样也是能正常运行的  

   self.emit(QtCore.SIGNAL("myslot"), self.text1(), self.text2())

 

也许信号和槽的机制在由多个发射源向多个槽发射信号时会起到很大作用,不过一般来讲,感觉这种机制还是太麻烦了一点。

0
0
分享到:
评论
1 楼 pandason125 2014-07-06  

    QtCore.QObject.connect(self.pb[i],  QtCore.SIGNAL("myslot(str)"), self.myslot)
TypeError: C++ type 'str' is not supported as a slot argument type
大哥你上面的代码好像行不通

相关推荐

    PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?.rar

    在PyQt框架中,设计GUI界面时我们常常使用Qt Designer工具来创建图形用户界面,而PyQt则将这些设计转化为Python代码。...理解这些方法并根据项目需求选择合适的方式,可以避免这个问题并实现有效的信号槽通信。

    PyQt5简明文档(中文版)V2.rar

    文档中可能还会包含错误处理、调试技巧以及与其他Python库的集成等内容,帮助开发者解决实际开发中遇到的问题。总的来说,这份文档全面覆盖了PyQt5的关键概念和技术,对于快速上手和进阶都有很大帮助。

    Python信号与槽、多线程、类学习笔记.pdf

    PyQt5中的信号与槽机制是一个非常强大的特性,它使得组件之间的通信和交互变得非常方便。此外,多线程是提升程序响应和性能的重要手段,而类则是面向对象编程的基础。下面我们一一展开这些主题。 首先,信号与槽...

    基于pyqt5和openAI的问题补全机器人源码.zip

    《基于PyQt5和OpenAI的问题补全...PyQt5负责搭建界面和处理用户交互,而OpenAI则提供了理解和生成自然语言的能力。这样的结合为开发高效、实用的问题解答工具提供了可能,同时也为未来的AI应用开发提供了新的思路。

    PyQt Manual.zip

    在使用PyQt5开发时,可以利用`help()`函数或者`dir()`函数查询类的方法和属性,同时,这份PyQt Manual.chm文档提供了详细的API文档和实例,是学习和解决问题的重要参考。 通过深入学习和实践,开发者将能够充分利用...

    pyqt白皮书

    4. **广泛的社区支持**:Qt拥有一个活跃的开发者社区,这意味着遇到问题时可以很容易地找到解决方案和支持。 #### 五、PyQt的优势 PyQt结合了Python和Qt的优点,成为构建GUI应用程序的理想选择: 1. **易用性和...

    PyQt5-PyQt-master.zip

    - **信号和槽(Signals & Slots)**:这是Qt和PyQt的核心机制,用于对象间的通信。当一个信号被触发时,可以调用一个或多个槽函数。 - **布局管理(Layout Management)**:帮助自动调整控件的位置和大小以适应窗口...

    5.装饰器信号与槽.zip

    在PyQT5中,装饰器(Decorator)和信号与槽(Signals & Slots)是两种非常重要的概念,它们在构建用户界面和实现事件驱动编程时起着核心作用。装饰器是Python语言的一种高级特性,用于修改函数或类的行为,而信号与...

    PyQt5的各种示例代码

    PyQt5是Python编程语言中一个非常强大的图形用户界面(GUI)工具包,它是Qt5库的Python绑定。Qt5库是由Trolltech(现在是The Qt Company)...在实际项目中,这些示例将作为宝贵的参考资料,帮助解决遇到的具体问题。

    PyQt的360显示界面

    此外,信号和槽(Signals & Slots)机制是PyQt中的核心通信方式,通过它们可以连接不同对象的事件,比如当扫描完成时,一个信号可以触发更新界面的槽函数。 在修复和优化这个项目时,首先需要定位Bug。这通常涉及...

    PYTHON QT GUI快速编程 PYQT编程指南

    在PyQT编程中,核心概念包括窗口部件(Widgets)、布局管理(Layouts)、信号与槽(Signals and Slots)以及事件处理(Event Handling)。窗口部件是构成GUI的基本元素,如按钮、文本框、标签等。布局管理则用于自动...

    pyQt写的一个读取图像的程序,

    【标题】"PyQt写的一个读取图像的程序"是一个基于...此外,还会涉及到QGraphicsScene和QGraphicsItem的使用,以及如何通过信号和槽机制实现用户与图像的交互。总之,这是一个全面了解和实践PyQt图像处理的好起点。

    PyQt5写的单词生词记录软件

    7. **事件处理**:PyQt5中的事件处理机制使得程序可以对用户的交互做出响应,例如,当用户点击“添加”按钮时,程序会捕获这一事件并执行相应的处理代码。 8. **异常处理**:考虑到程序的健壮性,开发者可能会在...

    PyQt4入门—简易教程

    PyQt4通过信号和槽机制来实现事件处理。信号是当某个事件发生时,控件会发射的事件,而槽则是连接到这些信号的函数,当信号被发射时,槽函数会被调用。这个部分对于理解PyQt4程序的工作方式非常重要。 此外,教程...

    PyQt5-5.13.2.tar.gz

    在开发过程中,了解PyQt5的文档、示例代码和社区资源是非常重要的,这可以帮助你充分利用其功能并解决遇到的问题。如果你需要开发桌面或Web应用,并希望使用Python,那么PyQt5是一个非常值得考虑的工具。

    PyQt5模板_学习指导手册_vcruntime140_1文件.rar

    3. **信号与槽**:这是Qt和PyQt5的核心特性,用于对象间的通信。当一个对象触发一个信号时,可以连接到一个或多个槽函数,实现响应。 4. **布局管理**:PyQt5提供了网格布局、流式布局、垂直布局和水平布局等,用于...

    PYQT5forpython3.4

    在安装过程中,可能会遇到使用常规方法(如pip)安装时出现错误的情况,这个定制的打包文件则解决了这个问题,确保在XP系统上能够顺利安装和运行PYQT5。 标签中包含的“python3.4”、“QT5.3.2”和“XP 32位”是...

    PyQt5 Jupyter 入门笔记

    此外,PyQt5还提供了信号和槽机制,这是事件处理的核心。信号是当特定事件发生时由对象发出的通知,而槽是响应这些信号的函数。通过将信号连接到槽,我们可以实现组件间的交互和事件响应。例如,当用户点击按钮时,...

    PyQt5_jb51.rar

    PyQt5是一个强大的图形用户界面(GUI)框架,它基于Python语言,并且是Qt库的Python绑定...建议按照文件结构逐一学习,动手实践,遇到问题时查阅官方文档或在线社区寻求解答,这将极大地促进对PyQt5的理解和应用能力。

    PyQt6 python 实战教程

    事件处理和信号槽** - **事件**:用户与 GUI 的交互,如点击按钮、移动鼠标等,都会触发事件。 - **槽函数**:响应事件的函数,可以通过 `@QtCore.Slot()` 装饰器定义。 - **连接信号和槽**:`QObject.connect()` ...

Global site tag (gtag.js) - Google Analytics