提前感謝您花時間閱讀本文。道歉,它有點冗長。但希望它完全解釋了這個問題。包含顯示問題的剝離代碼。使用子目錄時PyQt4 SIGNAL/SLOT問題
我遇到了PyQt4 SIGNAL/SLOTS的問題。雖然我可以使一切工作正常,如果我寫在一個單一的文件,我不能讓事情工作,如果我的一些功能,我希望使用移動到子目錄/類。
我查看了Python Bindings document我可以看到這是如何工作的,當使用單個文件。但我想要做的是這樣的:
- main.py在根目錄中的文件,其中包含主窗口
__init_
_代碼。 - 此文件導入一些小部件。每個小部件都存儲在其自己的子目錄中。所有的子目錄都包含一個
__init__.py
文件。這些子目錄位於名爲'bin'的目錄中,該目錄本身位於根目錄中 - 這些小部件中的一些需要在它們之間具有SIGNAL/SLOT鏈接這是我掉下來的地方。
所以文件的結構是:
- 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()來創建中心QTextEdit()
和main.py
中的函數。我希望它做同樣的事情,但連接到updateUi函數bin/textEditor/plugin.py
如果任何人都可以闡明這一點,我將非常感激。我相信這很簡單。但是,對於任何涵蓋這些內容的教程或者我所做的都非常錯誤的陳述,我都同樣讚賞!再次感謝您的時間:
### 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)
而且
### 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)
非常感謝您抽出寶貴的時間來回復我。非常感謝。 這確實是一個支持更通用的插件導入系統的框架,所以它看起來有點模糊。我一定會研究這些想法。你會碰巧能夠提供任何方向,雖然你已經提出了一些建議的例子嗎?例如,教程或代碼片段?這將有極大的幫助。 再次感謝。 Dan – Dan 2010-09-30 01:48:33