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