Форум сайта python.su
0
import sys from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QMainWindow, QApplication class Communicate(QObject): closeApp = pyqtSignal() class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.c = Communicate() self.c.closeApp.connect(self.close) self.setGeometry(300, 300, 290, 150) self.setWindowTitle('Emit signal') self.show() def mousePressEvent(self, event): self.c.closeApp.emit() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
Офлайн
294
я так понимаю вы читаете вот это http://python-3.ru/page/events-and-signals-in-pyqt5 или это https://pythonworld.ru/gui/pyqt5-eventssignals.html
там вроде все написано:
Мы создаём новый сигнал, именуемый closeApp. Этот сигнал испускается во время события нажатия кнопки мыши. Сигнал присоединяется к слоту close() класса QMainWindow.
class Communicate(QObject): closeApp = pyqtSignal() # наш сигнал
self.c = Communicate() # инстанс класса Communicate self.c.closeApp.connect(self.close) # соединяем сигнал self.c.closeApp с слотом self.close
def mousePressEvent(self, event): self.c.closeApp.emit() # генерируем сигнал
[code python][/code]
Отредактировано PEHDOM (Окт. 7, 2017 15:49:38)
Офлайн
186
> Сигнал создаётся с pyqtSignal() как атрибут класса внешнего класса Communicate.
Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.
Отредактировано Rodegast (Окт. 7, 2017 20:33:25)
Офлайн
294
Rodegastда я тоже не понимаю, его вполне можно было обьявить и в классе Example, но это ж обучалка, МБ автору это нужно гдето в дальнейшем, где он будет рассказывать про агрегацию и композицию. ХЗ.
Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.
[code python][/code]
Офлайн
857
PEHDOMИсточник здесь
я так понимаю вы читаете вот это http://python-3.ru/page/events-and-signals-in-pyqt5 или это https://pythonworld.ru/gui/pyqt5-eventssignals.html
RodegastОн нужен, чтобы связывать разные окна между собой. Если в Example создать сигналы, то их можно будет использовать только в пределах Example.
Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.
Отредактировано py.user.next (Окт. 8, 2017 01:29:23)
Офлайн
186
> МБ автору это нужно гдето в дальнейшем, где он будет рассказывать про агрегацию и композицию. ХЗ.
ИХМО всё намного проще. Автор сам не в курсе как оно работает, вот и выдаёт бред.
> Если в Example создать сигналы, то их можно будет использовать только в пределах Example.
Расскажи это своей бабушке.
Офлайн
857
RodegastСделай второе окно (такое же, как Example) и попробуй подключить этот сигнал к нему, чтобы при нажатии кнопки в первом окне происходило событие во втором окне. Тогда ты на практике поймёшь, почему оно наружу вынесено, хотя это и так очевидно.
Расскажи это своей бабушке.
>>> class A: ... def __init__(self, name): ... self.name = name ... >>> class B: ... a = A('name1') ... >>> class C: ... def m(self): ... b = B() ... print(b.a.name, id(b.a)) ... >>> class D: ... def m(self): ... b = B() ... print(b.a.name, id(b.a)) ... >>> c = C() >>> d = D() >>> c.m() name1 140118798922864 >>> d.m() name1 140118798922864 >>>
Отредактировано py.user.next (Окт. 8, 2017 16:03:08)
Офлайн
186
> Сделай второе окно (такое же, как Example) и попробуй подключить этот сигнал к нему, чтобы при нажатии кнопки в первом окне происходило событие во втором окне.
Ну вот тебе 2 окна и ни каких Communicate.
import sys import PySide.QtGui as QtGui import PySide.QtCore as QtCore class X(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.label = QtGui.QLabel(self) self.setCentralWidget(self.label) dialog = Dialog(self) dialog.signal.connect(self.slot) dialog.show() def slot(self): self.label.setText(self.label.text()+u"Обломись баклан!\n") class Dialog(QtGui.QDialog): signal = QtCore.Signal() def __init__(self, parent): QtGui.QDialog.__init__(self, parent) self.knopka = QtGui.QPushButton(self) self.knopka.setText(u"Нажми меня") self.knopka.clicked.connect(self.signal) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) win = X() win.show() sys.exit(app.exec_())
Отредактировано Rodegast (Окт. 8, 2017 16:44:58)
Офлайн
857
RodegastВот ты тупой реально. Говорю “создай два независимых окна”, этот создаёт иерархию окон. Теперь удали Dialog и вся твоя фигня посыпется, потому что остальные окна зависят от него. Мало того, ты теперь не можешь с этим сигналом ничего сделать в классе Dialog, потому что в класс диалога лезет какое-то там окно и фиксирует имя.
Ну вот тебе 2 окна
RodegastДебилоид пока что только ты здесь. Тот пацан в ООП понимает и создал внешний класс для общения между окнами, потому что предвидит будущую разработку. Он абстрагировал взаимодействие между окнами в отличие от тебя дурака, который связывает всё воедино при первой возможности.
Оно вынесено потому что код писался дебилойдом.
RodegastЯ ни на кого не ориентируюсь; я смотрю, как оно там написано.
ты зря на них ориентируешся
RodegastТам нет никаких ошибок, ты просто недостаточно умён, чтобы понять принципы, по которым там всё написано. Читай книги по ООП, развивайся, иначе так и будешь дураком.
В примерах на zetcode дофига ошибок
Отредактировано py.user.next (Окт. 9, 2017 01:05:42)
Офлайн
294
py.user.nextВозможно, но в данном случае это избыточно, это же обучающий пример, призваный показать как создать свой собственный сигнал, а не как абстрагировать взаимодействие между окнами. ИМХО это только запутывает начинающих, что мы и видим на примере топикстартера.
предвидит будущую разработку
[code python][/code]
Отредактировано PEHDOM (Окт. 9, 2017 10:53:28)
Офлайн