Python 使用子目录时PyQt4信号/插槽问题

Python 使用子目录时PyQt4信号/插槽问题,python,qt,qt4,pyqt,pyqt4,Python,Qt,Qt4,Pyqt,Pyqt4,提前感谢您抽出时间阅读本文。抱歉,这有点冗长。但希望它能充分解释这个问题。包括演示该问题的剥离代码 我对PyQt4信号/插槽有问题。虽然如果我在一个文件中编写,我可以使一切正常工作,但如果我希望使用的某些函数被移动到子目录/类中,我就无法使一切正常工作 我已经看过了,我可以看到在使用单个文件时这是如何工作的。但我想做的是: 根目录中的main.py文件,其中包含main窗口\uuu init\uu\uu代码 此文件导入许多小部件。每个小部件都存储在自己的子目录中。所有子目录都包含一个\uuuu

提前感谢您抽出时间阅读本文。抱歉,这有点冗长。但希望它能充分解释这个问题。包括演示该问题的剥离代码

我对PyQt4信号/插槽有问题。虽然如果我在一个文件中编写,我可以使一切正常工作,但如果我希望使用的某些函数被移动到子目录/类中,我就无法使一切正常工作

我已经看过了,我可以看到在使用单个文件时这是如何工作的。但我想做的是:

  • 根目录中的main.py文件,其中包含main窗口
    \uuu init\uu
    \uu代码
  • 此文件导入许多小部件。每个小部件都存储在自己的子目录中。所有子目录都包含一个
    \uuuu init\uuuu.py
    文件。这些子目录位于名为“bin”的目录中,该目录本身位于根目录中
  • 这些小部件中的一些需要在它们之间有信号/插槽链接,这就是我的缺点
因此,文件结构是:

 - main.py
 - bin/textEditor/__init__.py
 - bin/textEditor/plugin.py
 - bin/logWindow/__init__.py
 - bin/logWindow/plugin.py
下面的代码显示了该问题。这段代码创建了一个非常基本的主窗口,其中包含一个中央
QTextEdit()
小部件和一个可停靠的
QTextEdit()
小部件。所发生的一切是,当中央小部件中的文本发生更改时,相同的文本将显示在可固定小部件中。这个例子很有效。但它是通过连接
bin/textEditor/plugin.py
文件中的信号textChanged()来实现的,该文件使用
main.py
中的函数创建中心
QTextEdit()
。我希望它能做完全相同的事情,但是连接到
bin/textdeditor/plugin.py中的updateUi函数

如果有人能解释这一点,我将不胜感激。我相信这很简单。但是,对于任何涉及到这一点的教程的指导,或者我所做的一切都是非常错误的陈述,我们都同样感激!。再次感谢您抽出时间:

### main.py
import os
import sys
# Import PyQT modules
from PyQt4.QtCore import *
from PyQt4.QtGui import *

# Start the main class
class MainWindow(QMainWindow):

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

        # Name and size the main window
        self.setWindowTitle("EDITOR/LOG")
        self.resize(800, 600)

        import bin.logWindow.plugin as logWindow
        logWindow.create(self)

        import bin.textEditor.plugin as textEditor
        textEditor.create(self)

    def updateUi(self): 
        # I can connect to this function from within bin/textEditor/plugin.py (see 
        # below) but I want to connect to the function located in 
        # bin/textEditor/plugin.py instead
        text = self.editor.toPlainText()
        self.logWidget.setText(text)

# Run the app
def main():
    app = QApplication(sys.argv)
    form = MainWindow()
    form.show()
    app.exec_()
# Call main
main()
两个插件文件中的代码是:

### bin/textEditor/plugin.py
# Import PyQT modules
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def create(self):
    # Add a dockable widget
    self.logDockWidget = QDockWidget("Log", self)
    self.logDockWidget.setObjectName("LogDockWidget")
    self.logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|
                                       Qt.RightDockWidgetArea)

    self.logWidget = QTextEdit()
    self.logDockWidget.setWidget(self.logWidget)
    self.addDockWidget(Qt.LeftDockWidgetArea, self.logDockWidget)


首先,您使用非常旧版本的PyQt发布文档有什么原因吗?新的是:

你正在做的一些事情有点不寻常。python中的导入语句通常放在文件的顶部(以便更容易地查看依赖项),但我假设您这样做是为了将来支持更通用的插件导入系统


基本问题似乎是,您试图将信号源连接到另一个对象中的插槽,而不将另一个对象存储在特定位置。要做到这一点,您可能需要在main中建立连接,创建一个中立的“updateUi”插槽,该插槽发出所有插件都在等待的特殊信号,或者只需在main中保留对这些子对象的引用,并小心初始化顺序。

非常感谢您花时间作出响应,jkerian。非常感谢。它确实是一个支持更通用的插件导入系统的框架,所以看起来有点模糊。我一定会研究这些想法。您是否能够提供一些关于您所提建议的示例的指导?例如教程或代码剪贴?这将大有帮助。再次感谢。丹
### bin/logWindow/plugin.py
Import PyQT modules
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def create(self):

    # Create a text editing box
    self.editor = QTextEdit()

    # Add to main window
    self.setCentralWidget(self.editor)

    # connect text change to update log window. This is presumably what I need to 
    # change so that it connects to the function below instead of the on in main.py
    self.connect(self.editor, SIGNAL("textChanged()"), self.updateUi)

def updateUi(self):
    text = self.editor.toPlainText()
    self.logWidget.setText(text)