GF
10 января 2021 г. 22:52

Сигналы и слоты в PyQt5

UI

Пример тестового интерфейса с описанием подключения слота и сигнала, но оно не срабатывает по непонятным причинам.

  1. import sys, binascii, glob, asyncio
  2. from PyQt5.QtCore import QObject, pyqtSlot, QDateTime, Qt, QTimer
  3. from PyQt5 import QtCore, QtGui, QtWidgets
  4. from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
  5. QDial, QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
  6. QProgressBar, QPushButton, QRadioButton, QScrollBar, QSizePolicy,
  7. QSlider, QSpinBox, QStyleFactory, QTableWidget, QTabWidget, QTextEdit,
  8. QVBoxLayout, QWidget, QMainWindow, QMessageBox)
  9.  
  10. class Ui_MainWindow(object):
  11. def setupUi(self, MainWindow):
  12. MainWindow.setObjectName("MainWindow"); MainWindow.resize(400, 300);
  13. self.centralWidget = QtWidgets.QWidget(MainWindow); self.centralWidget.setObjectName("centralWidget");
  14. self.gridLayout = QtWidgets.QGridLayout(self.centralWidget); self.gridLayout.setContentsMargins(11,11,11,11);
  15. self.gridLayout.setSpacing(6); self.gridLayout.setObjectName("gridLayout");
  16. self.verticalLayout = QtWidgets.QVBoxLayout(); self.verticalLayout.setSpacing(6);
  17. self.verticalLayout.setObjectName("verticalLayout");
  18. self.pushButtonFirst = QtWidgets.QPushButton(self.centralWidget);
  19. self.pushButtonFirst.setObjectName("pushButtonFirst");self.verticalLayout.addWidget(self.pushButtonFirst);
  20. self.pushButtonSecond = QtWidgets.QPushButton(self.centralWidget);
  21. self.pushButtonSecond.setObjectName("pushButtonSecond");self.verticalLayout.addWidget(self.pushButtonSecond);
  22. self.checkBox = QtWidgets.QCheckBox(self.centralWidget);
  23. self.checkBox.setObjectName("checkBox"); self.verticalLayout.addWidget(self.checkBox);
  24. self.lineEdit = QtWidgets.QLineEdit(self.centralWidget);
  25. self.lineEdit.setObjectName("lineEdit"); self.verticalLayout.addWidget(self.lineEdit);
  26. self.gridLayout.addLayout(self.verticalLayout,0,0,1,1);MainWindow.setCentralWidget(self.centralWidget);
  27. self.menuBar = QtWidgets.QMenuBar(MainWindow);self.menuBar.setGeometry(QtCore.QRect(0,0,400,21));
  28. self.menuBar.setObjectName("menuBar");MainWindow.setMenuBar(self.menuBar);
  29. self.mainToolBar = QtWidgets.QToolBar(MainWindow);self.mainToolBar.setObjectName("mainToolBar");
  30. MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar);
  31. self.statusBar = QtWidgets.QStatusBar(MainWindow);self.statusBar.setObjectName("statusBar");
  32. MainWindow.setStatusBar(self.statusBar);self.retranslateUi(MainWindow);
  33. QtCore.QMetaObject.connectSlotsByName(MainWindow);
  34.  
  35. def retranslateUi(self, MainWindow):
  36. _translate = QtCore.QCoreApplication.translate
  37. MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
  38. self.pushButtonFirst.setText(_translate("MainWindow", "PushButton"))
  39. self.pushButtonSecond.setText(_translate("MainWindow", "PushButton"))
  40. self.checkBox.setText(_translate("MainWindow", "CheckBox"))
  41.  
  42. class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
  43. def __init__(self, parent=None):
  44. super(MainWindow, self).__init__(parent); self.setupUi(self);
  45. self.pushButtonFirst.released.connect(self.pushButtonClicked)
  46. #self.pushButtonFirst.clicked.connect(self.pushButtonClicked)
  47.  
  48. @QtCore.pyqtSlot()
  49. def pushButtonClicked(self):
  50. try:
  51. sender = self.sender();
  52. self.statusBar().showMessage(sender.text() + ' was pressed')
  53. msg = QMessageBox();
  54. msg.setIcon(QMessageBox.Information);
  55. msg.setText("This is a message box");
  56. msg.setInformativeText("This is additional information");
  57. msg.setWindowTitle("MessageBox demo");
  58. msg.setDetailedText("The details are as follows:");
  59. msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel);
  60. msg.exec_();
  61. except Exception as e:
  62. return str(e);
  63.  
  64. if __name__ == "__main__":
  65. app=QtWidgets.QApplication(sys.argv); w=MainWindow(); w.show(); sys.exit(app.exec_())
  66.  
2
Вопрос задан по статьеPyQt5 - Урок 002. Hello World на PyQt5

Вам это нравится? Поделитесь в социальных сетях!

2
Михаиллл
  • 11 января 2021 г. 18:36

Попробуйте сделать всю работу с одном в одном классе. И лучше проверяйте нажатие кнопки.

    GF
    • 22 февраля 2021 г. 1:03

    Решение стало следующим: после конвертации файла Ui из QtDesigner мне никак не выгодно продолжать работать в этом же файле, т.к. я постоянно продолжаю дорабатывать интерфейс, а его поведение я описываю в другом файле, поэтому я делаю следующее описание

    1. # Импорт класса графического интерфейса
    2. import GUISignalWriter as GUI

    Затем я создаю класс, в котором описываю подключение интерфейса и создание слотов для элементов управления

    1. #%% Точка входа в программу
    2. class MainWindow(QtWidgets.QMainWindow, GUI.Ui_MainWindow):
    3. def __init__(self, parent=None):
    4. # инициализация интерфейса
    5. super(MainWindow, self).__init__(parent); self.setupUi(self);

    В таком случае я безпрепятственно постоянно могу корректировать интерфейс и безпрепятственно ориентироваться в другом классе для управления поведением новыми элементами управления.

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь