PyQt5: слот в отдельном файле не вызывается
В настоящее время у меня есть базовый графический интерфейс с каждой страницей в отдельном файле. Я могу без проблем перемещаться по страницам и с каждой страницы, но мне трудно просто передать поисковый запрос в другой виджет. Вот где я устанавливаю соединения в основном файле:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import search
import watching
import helpinfo
import results
class MainWindow(QMainWindow):
def __init__(self, parent=None):
'''
Constructor
'''
QMainWindow.__init__(self, parent)
self.centralWidget = QStackedWidget()
self.setCentralWidget(self.centralWidget)
self.startScreen = Start(self)
self.searchScreen = search.Search(self)
self.watchingScreen = watching.Watching(self)
self.helpInfoScreen = helpinfo.HelpInfo(self)
self.resultsScreen = results.Results(self)
self.centralWidget.addWidget(self.startScreen)
self.centralWidget.addWidget(self.searchScreen)
self.centralWidget.addWidget(self.watchingScreen)
self.centralWidget.addWidget(self.helpInfoScreen)
self.centralWidget.addWidget(self.resultsScreen)
self.centralWidget.setCurrentWidget(self.startScreen)
self.startScreen.searchClicked.connect(lambda: self.centralWidget.setCurrentWidget(self.searchScreen))
self.startScreen.watchingClicked.connect(lambda: self.centralWidget.setCurrentWidget(self.watchingScreen))
self.startScreen.helpInfoClicked.connect(lambda: self.centralWidget.setCurrentWidget(self.helpInfoScreen))
self.searchScreen.searchSubmitted.connect(lambda: self.centralWidget.setCurrentWidget(self.resultsScreen))
self.searchScreen.passQuery.connect(lambda: self.resultsScreen.grabSearch) #This is the problem line
self.searchScreen.clicked.connect(lambda: self.centralWidget.setCurrentWidget(self.startScreen))
self.watchingScreen.clicked.connect(lambda: self.centralWidget.setCurrentWidget(self.startScreen))
self.helpInfoScreen.clicked.connect(lambda: self.centralWidget.setCurrentWidget(self.startScreen))
self.resultsScreen.clicked.connect(lambda: self.centralWidget.setCurrentWidget(self.startScreen))
Вот поисковый файл:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
class Search(QWidget):
clicked = pyqtSignal()
searchSubmitted = pyqtSignal()
passQuery = pyqtSignal(str)
def __init__(self, parent=None):
super(Search, self).__init__(parent)
logo = QLabel(self)
pixmap = QPixmap('res/logo.png')
logo.setPixmap(pixmap)
logo.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
logo.setAlignment(Qt.AlignCenter)
self.textbox = QLineEdit(self)
label = QLabel(text="This is the search page.")
label.setAlignment(Qt.AlignCenter)
button = QPushButton(text='Submit')
button.clicked.connect(lambda: self.submitSearch())
button2 = QPushButton(text='Go back.')
button2.clicked.connect(self.clicked.emit)
layout = QVBoxLayout()
layout.addWidget(logo)
layout.addWidget(label)
layout.addWidget(self.textbox)
layout.addWidget(button)
layout.addWidget(button2)
layout.setAlignment(Qt.AlignTop)
self.setLayout(layout)
def submitSearch(self):
self.searchSubmitted.emit()
self.passQuery.emit(self.textbox.text())
И вот файл результатов:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Results(QWidget):
clicked = pyqtSignal()
def __init__(self, parent=None):
super(Results, self).__init__(parent)
# Create Logo
logo = QLabel(self)
pixmap = QPixmap('res/logo.png')
logo.setPixmap(pixmap)
logo.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
logo.setAlignment(Qt.AlignCenter)
# Create page contents
label = QLabel(text="This is the results page. If you see this, it's still broken.")
label.setAlignment(Qt.AlignCenter)
button = QPushButton(text='Add to watching.')
button2 = QPushButton(text='Go back.')
button2.clicked.connect(self.clicked.emit)
# Set up layout
layout = QVBoxLayout()
layout.addWidget(logo)
layout.addWidget(label)
layout.addWidget(button)
layout.addWidget(button2)
layout.setAlignment(Qt.AlignTop)
self.setLayout(layout)
@pyqtSlot(str)
def grabSearch(self, str):
print(str)
self.label.setText(str)
То, как я это понимаю, то, что я имею сейчас, должно работать. Когда пользователь отправляет некоторый текст на страницу поиска, он вызывает функцию submitSearch(). Эта функция испускает два сигнала: первый searchSubmitted меняет экран на экран результатов (это работает как задумано). Второе, passQuery, должно передавать содержимое текстового поля подключенной функции grabSearch() в файле результатов. Тем не менее, кажется, что passQuery никогда не попадает на страницу результатов, несмотря на то, что он подключен. Я подтвердил с печатными заявлениями, что это испускается, но это - все.
Что мне здесь не хватает?
1 ответ
В вашем коде есть следующие ошибки:
- Если вы собираетесь использовать лямбду для установления соединения, вы должны вызвать функцию с аргументами.
self.searchScreen.passQuery.connect(lambda text: self.resultsScreen.grabSearch(text))
Но лучше использовать прямое соединение, так как подписи одинаковые:
self.searchScreen.passQuery.connect(self.resultsScreen.grabSearch)
Другая ошибка заключается в том, что метка results.py должна быть членом класса:
self.label = QLabel(text="This is the results page. If you see this, it's still broken.") # <-- self.label.setAlignment(Qt.AlignCenter) # <-- # .. # Set up layout layout = QVBoxLayout() layout.addWidget(logo) layout.addWidget(self.label) # <--
И, наконец, не используйте зарезервированные слова, такие как
str
изменить на:@pyqtSlot(str) def grabSearch(self, text): self.label.setText(text)