Форум русскоязычного сообщества Ubuntu


Автор Тема: PyQt5. Помогите разобраться со слотами и сигналами.  (Прочитано 942 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Axa-Ru

  • Автор темы
  • Гость
Никак не разберусь со слотами и сигналами.
Концепцию понимаю. Не понимаю как правильно использовать это.

У меня PyQt5, Python3, Ubuntu.

Я с помощью QT Designer нарисовал MainWindow с кнопкой и StatusBat.

Сгенерил код на python и добавил в него метод msgBtnPushed(self), который должен вызываться при нажатии на кнопку.

Код: Python
  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Form implementation generated from reading ui file 'win_mainwnd_03.ui'
  5. #
  6. # Created by: PyQt5 UI code generator 5.2.1
  7. #
  8. # WARNING! All changes made in this file will be lost!
  9.  
  10. from PyQt5 import QtCore, QtGui, QtWidgets
  11.  
  12. class Ui_MainWindow(object):
  13.     def setupUi(self, MainWindow):
  14.         MainWindow.setObjectName("MainWindow")
  15.         MainWindow.resize(538, 364)
  16.         self.centralwidget = QtWidgets.QWidget(MainWindow)
  17.         self.centralwidget.setObjectName("centralwidget")
  18.         self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  19.         self.pushButton.setGeometry(QtCore.QRect(100, 110, 351, 101))
  20.         self.pushButton.setObjectName("pushButton")
  21.         MainWindow.setCentralWidget(self.centralwidget)
  22.         self.statusbar = QtWidgets.QStatusBar(MainWindow)
  23.         self.statusbar.setObjectName("statusbar")
  24.         MainWindow.setStatusBar(self.statusbar)
  25.  
  26.         self.retranslateUi(MainWindow)
  27.         QtCore.QMetaObject.connectSlotsByName(MainWindow)
  28.  
  29.     def retranslateUi(self, MainWindow):
  30.         _translate = QtCore.QCoreApplication.translate
  31.         MainWindow.setWindowTitle(_translate("MainWindow", "Исследуем слоты и коннекты"))
  32.         self.pushButton.setText(_translate("MainWindow", "Нажми меня"))
  33.  
  34.     def msgBtnPushed(self):
  35.         self.statusbar.showMessage("Ух! Нажали!")
  36.  
  37.  
  38. if __name__ == "__main__":
  39.     import sys
  40.     app = QtWidgets.QApplication(sys.argv)
  41.     MainWindow = QtWidgets.QMainWindow()
  42.     ui = Ui_MainWindow()
  43.     ui.setupUi(MainWindow)
  44.     MainWindow.show()
  45.     sys.exit(app.exec_())
  46.  

Теперь я должен определить сигнал и указать слот, который должен этот сигнал обрабатывать.
Как указать сигнал, который будет генериться при нажатии на кнопку self.pushButton?

Где и как нужно указать слот, который при поступлении сигнала вызовет метод msgBtnPushed?

И еще один мелкий вопрос. Я использую  Ubuntu и преобразую файл формы в код python следующей командой:

Код: Bash
  1. pyuic5 -x win_mainwnd_03.ui -o win_mainwnd_03e.py
  2. chmod +x win_mainwnd_03e.py
При этом в коде отсутствует строка определения интерпретатора python.
Я ее добавляю либо руками либо командой
Код: Bash
  1. sed -i '1s/^/#!\/usr\/bin\/python3\n/' ./win_mainwnd_03e.py

Почему автоматически не вставляется строка вызова интепретатора?
Может я что то делаю не так?

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 716
    • Просмотр профиля
Попробуй
Код: Python
  1. self.pushButton.clicked.connect(self.msgBtnPushed)

Прочитал тут - http://stackoverflow.com/questions/19966056/pyqt5-how-can-i-connect-a-qpushbutton-to-a-slot

Ну и читай документацию http://pyqt.sourceforge.net/Docs/PyQt4/qpushbutton.html#details
« Последнее редактирование: 31 Март 2016, 18:16:06 от aSmile »

Axa-Ru

  • Автор темы
  • Гость
Спасибо. Это работает.
В данном случае используется прямой вызов при нажатии на кнопку.

Но я хочу чтоб генерилось событие и его ловил нужный обработчик (слот).
Этот механизм описан здесь:
http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html?highlight=connectslotsbyname
Но я никак не врубаюсь, как его задействовать.

ЗЫ. Или я не прав.... вроде как вызывается connect....
« Последнее редактирование: 31 Март 2016, 18:27:25 от Axa-Ru »

serchik

  • Автор темы
  • Гость
Каждый виджет в конечном счете наследуется от QObject, который имеет метод connect

Пользователь решил продолжить мысль 31 Март 2016, 18:32:09:
В Вашем случае self.pushButton.connect(...)

Axa-Ru

  • Автор темы
  • Гость
serchik,
спасибо.

 

Страница сгенерирована за 0.082 секунд. Запросов: 25.