Спасибо заранее, что нашли время, чтобы прочитать это. Извиняюсь, что это несколько многословно. Но, надеюсь, это полностью объясняет проблему. Раздетый код, демонстрирующий проблему, включен.
У меня проблема с 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)