2010-09-30 2 views
2

Заранее благодарим за то, что нашли время, чтобы прочитать это. Извиняется, что это несколько многословно. Но, надеюсь, это полностью объясняет проблему. Включаемый код, демонстрирующий проблему, включен.Проблема PyQt4 SIGNAL/SLOT при использовании подкаталогов

У меня проблема с PyQt4 SIGNAL/SLOTS. Хотя я могу заставить все работать нормально, если я пишу в одном файле, я не могу заставить работу работать, если некоторые из функций, которые я хочу использовать, перемещаются в подкаталоги/классы.

Я просмотрел Python Bindings document. Я вижу, как это работает при использовании одного файла. Но то, что я пытаюсь сделать это:

  • main.py файл в корневой директории, который содержит MainWindow __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() виджетов. Все, что происходит, это то, что при изменении текста в центральном виджетах тот же текст отображается в прикрепляемом виджете. Пример работает. Но он делает это, подключив сигнал textChanged() в файле bin/textEditor/plugin.py, который создает центральный 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 размещаются в верхней части файла (для более простого просмотра зависимостей), но я предполагаю, что вы делаете это для поддержки более обобщенной системы импорта для плагинов в будущем.

Похоже, основная проблема заключается в том, что вы пытаетесь подключить источник сигнала к слоту в другом объекте, не сохраняя этот другой объект в определенном месте. Для этого вам, вероятно, необходимо либо сделать подключение в основном, сделать нейтральный слот «updateUi», который испускает свой собственный специальный сигнал, который ожидают все плагины, или просто держите ссылку на эти подобъекты в главном меню и будьте осторожны с порядок инициализации.

+0

Большое спасибо за то, что нашли время ответить, jkerian. Это очень ценно. Это действительно основа для поддержки более обобщенной системы импорта для плагинов, поэтому она выглядит немного неясной. Я обязательно рассмотрю эти идеи. Не могли бы вы оказать какое-либо направление на некоторые примеры предложений, которые вы сделали? Например, учебник или код? Это очень поможет. Еще раз спасибо. Dan – Dan

Смежные вопросы