Форум сайта python.su
Никак не разберусь со слотами и сигналами.
Концепцию понимаю. Не понимаю как правильно использовать это.
У меня PyQt5, Python3, Ubuntu.
Я с помощью QT Designer нарисовал MainWindow с кнопкой и StatusBat.
Сгенерил код на python и добавил в него метод msgBtnPushed(self), который должен вызываться при нажатии на кнопку.
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'win_mainwnd_03.ui' # # Created by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(538, 364) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(100, 110, 351, 101)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Исследуем слоты и коннекты")) self.pushButton.setText(_translate("MainWindow", "Нажми меня")) def msgBtnPushed(self): self.statusbar.showMessage("Ух! Нажали!") if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
pyuic5 -x win_mainwnd_03.ui -o win_mainwnd_03e.py chmod +x win_mainwnd_03e.py
sed -i '1s/^/#!\/usr\/bin\/python3\n/' ./win_mainwnd_03e.py
Отредактировано AxaRu (Март 31, 2016 17:52:54)
Офлайн
Видишь там написано
AxaRuэто значит, что код менять не имеет смысла. Он будет перезатёрт при любом изменении формы в дизайнере. Он должен быть в отдельном файле и от него нужно наследовать основное окно. И в нём, в своём окне, ты уже можешь получать доступ к элементам из этой формы. Там же и сигналы присоединяешь к слотам.# WARNING! All changes made in this file will be lost!
AxaRuКак раз поэтому. Он используется только для наследования. А для импорта модуля строка шебанг не нужна.
Почему автоматически не вставляется строка вызова интепретатора?
Может я что то делаю не так?
AxaRuОткрой Qt Assistant, там есть все классы и в них описаны все сигналы и все слоты.
Как указать сигнал, который будет генериться при нажатии на кнопку self.pushButton?
AxaRuОн может быть как сделан вручную, так и быть уже встроенным. В документации к Qt обычно перечислены и сигналы, и слоты.
Где и как нужно указать слот, который при поступлении сигнала вызовет метод msgBtnPushed?
AxaRuЛучше так
Я ее добавляю либо руками либо командойsed -i '1s/^/#!\/usr\/bin\/python3\n/' ./win_mainwnd_03e.py
sed -i~ '1s%^%#!/usr/bin/env python3\n\n%' file.txt
Отредактировано py.user.next (Апрель 2, 2016 13:35:15)
Офлайн
Приветствую !
Нету время особенно вчитываться и разбираться, так что подскажу только насчет генерирования сигнала. Это решается с помощью одной строчки кода :
self.pushButton.clicked.connect(self.msgBtnPushed)
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(538, 364) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(100, 110, 351, 101)) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.msgBtnPushed) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Исследуем слоты и коннекты")) self.pushButton.setText(_translate("MainWindow", "Нажми меня")) def msgBtnPushed(self): self.statusbar.showMessage("Ух! Нажали!") if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
Офлайн
Админы, просьба. Вместо поднять репутацию для Lestoroer тыкнул на опустить.
Просьба огромная поменяйте пожалуйста с минуса на плюс. У меня не получается это сделать.
Lestoroer, дико извиняюсь. Промахнулся.
Отредактировано AxaRu (Апрель 20, 2016 20:33:40)
Офлайн