Проблема PyQt4 SIGNAL / SLOT при использовании подкаталогов - PullRequest
2 голосов
/ 30 сентября 2010

Спасибо заранее, что нашли время, чтобы прочитать это. Извиняюсь, что это несколько многословно. Но, надеюсь, это полностью объясняет проблему. Раздетый код, демонстрирующий проблему, включен.

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

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

  • файл main.py в корневом каталоге, содержащий код MainWindow __init_ _.
  • Этот файл импортирует несколько виджетов. Каждый виджет хранится в своем собственном подкаталоге. Все подкаталоги содержат файл __init__.py. Эти подкаталоги находятся внутри директории bin, которая сама находится в корневом каталоге dir
  • Некоторые из этих виджетов должны иметь между собой ссылки 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)

1 Ответ

2 голосов
/ 30 сентября 2010

Для начала, есть ли причина, по которой вы используете очень старую версию документа релиза PyQt?Новое: здесь

Есть несколько необычных вещей, которые вы делаете.Обычно операторы импорта в python помещаются вверху файла (чтобы легче было видеть зависимости), но я предполагаю, что вы делаете это для поддержки более обобщенной системы импорта плагинов в будущем.

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

...