Заранее благодарим за то, что нашли время, чтобы прочитать это. Извиняется, что это несколько многословно. Но, надеюсь, это полностью объясняет проблему. Включаемый код, демонстрирующий проблему, включен.Проблема 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)
Большое спасибо за то, что нашли время ответить, jkerian. Это очень ценно. Это действительно основа для поддержки более обобщенной системы импорта для плагинов, поэтому она выглядит немного неясной. Я обязательно рассмотрю эти идеи. Не могли бы вы оказать какое-либо направление на некоторые примеры предложений, которые вы сделали? Например, учебник или код? Это очень поможет. Еще раз спасибо. Dan – Dan