2010-09-30 58 views
2

提前感謝您花時間閱讀本文。道歉,它有點冗長。但希望它完全解釋了這個問題。包含顯示問題的剝離代碼。使用子目錄時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) 

回答

2

對於初學者來說,有沒有您使用的是有原因的PyQt發佈文檔的舊版本?新的是:here

有幾件事你做的有點不同尋常。通常,python中的import語句放在文件的頂部(以便更容易地看到依賴關係),但我假設你這樣做是爲了支持未來更通用的插件導入系統。

看起來基本問題在於,您嘗試將信號源連接到另一個對象的插槽,而不將該其他對象存儲在特定位置。要做到這一點,你可能需要在main中建立連接,創建一箇中性的「updateUi」插槽,它發出所有插件正在等待的它自己的特殊信號,或者只保留對這些子對象的引用,並小心初始化順序。

+0

非常感謝您抽出寶貴的時間來回復我。非常感謝。 這確實是一個支持更通用的插件導入系統的框架,所以它看起來有點模糊。我一定會研究這些想法。你會碰巧能夠提供任何方向,雖然你已經提出了一些建議的例子嗎?例如,教程或代碼片段?這將有極大的幫助。 再次感謝。 Dan – Dan 2010-09-30 01:48:33