Найти - Пользователи
Полная версия: PyQt5. Помогите разобраться со слотами и сигналами.
Начало » GUI » PyQt5. Помогите разобраться со слотами и сигналами.
1
AxaRu
Никак не разберусь со слотами и сигналами.
Концепцию понимаю. Не понимаю как правильно использовать это.

У меня 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_())

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

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

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

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

Почему автоматически не вставляется строка вызова интепретатора?
Может я что то делаю не так?
py.user.next
Видишь там написано
AxaRu
# WARNING! All changes made in this file will be lost!
это значит, что код менять не имеет смысла. Он будет перезатёрт при любом изменении формы в дизайнере. Он должен быть в отдельном файле и от него нужно наследовать основное окно. И в нём, в своём окне, ты уже можешь получать доступ к элементам из этой формы. Там же и сигналы присоединяешь к слотам.

AxaRu
Почему автоматически не вставляется строка вызова интепретатора?
Может я что то делаю не так?
Как раз поэтому. Он используется только для наследования. А для импорта модуля строка шебанг не нужна.

AxaRu
Как указать сигнал, который будет генериться при нажатии на кнопку self.pushButton?
Открой Qt Assistant, там есть все классы и в них описаны все сигналы и все слоты.
Неплохой tutorial
Неплохой tutorial. сигналы и слоты

AxaRu
Где и как нужно указать слот, который при поступлении сигнала вызовет метод msgBtnPushed?
Он может быть как сделан вручную, так и быть уже встроенным. В документации к Qt обычно перечислены и сигналы, и слоты.
Слот - это обычный метод, он может быть с аргументом(ами), но чаще без аргумента. Его аргументы должны совпадать с аргументами сигнала.


AxaRu
Я ее добавляю либо руками либо командой
sed -i '1s/^/#!\/usr\/bin\/python3\n/' ./win_mainwnd_03e.py
Лучше так
sed -i~ '1s%^%#!/usr/bin/env python3\n\n%' file.txt
Во-первых, не всегда получается то, что ожидаешь даже со 100%-ой уверенностью (нужен бэкап файла). Во-вторых, если есть больше одного слеша, лучше заменить символ на другой (чаще на процент, хотя можно и другие). А в-третьих, сам питон может находиться где угодно, поэтому за его поиск отвечает утилита env, которая всегда находится по известному пути.
Lestoroer
Приветствую !
Нету время особенно вчитываться и разбираться, так что подскажу только насчет генерирования сигнала. Это решается с помощью одной строчки кода :
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_())
AxaRu
Админы, просьба. Вместо поднять репутацию для Lestoroer тыкнул на опустить.
Просьба огромная поменяйте пожалуйста с минуса на плюс. У меня не получается это сделать.

Lestoroer, дико извиняюсь. Промахнулся.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB