Форум сайта python.su
Здравствуйте.
Не получается сделать передачу данных в сигнале.
Сделал через несколько разных методов. Подскажите как переделать в один метод, что бы в нём передавалось значение через параметр.
Сделано: set_table_size_3, set_table_size_4, set_table_size_5
Хочется: set_table_size(count)
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys import random from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QGridLayout, QPushButton, QAction from PyQt5.QtCore import QSize, pyqtSignal, QBasicTimer class MainWindow(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.m_gridTable_Schulte = OstGridTable(self) # создание экземпляра класса OstGridTable self.setCentralWidget(self.m_gridTable_Schulte) # назначение таблицы (OstGridTable) центральным виджетом main_menu = self.menuBar() # создание экземпляра меню (строка меню) size_menu = main_menu.addMenu('Задать размер таблицы') size_button = QAction('3x3', self) size_button.setStatusTip('Создать поле размером 3x3') size_button.triggered.connect(self.m_gridTable_Schulte.set_table_size_3) size_menu.addAction(size_button) size_button = QAction('4x4', self) size_button.setStatusTip('Создать поле размером 4x4') size_button.triggered.connect(self.m_gridTable_Schulte.set_table_size_4) size_menu.addAction(size_button) size_button = QAction('5x5', self) size_button.setStatusTip('Создать поле размером 5x5') size_button.triggered.connect(self.m_gridTable_Schulte.set_table_size_5) size_menu.addAction(size_button) self.show() # отображаем окно на экране class OstGridTable(QWidget): m_grid_table_schulte = QGridLayout() # создаём экземпляр класса QGridLayout def __init__(self, parent): super().__init__(parent) self.table_size = 5 # размерность таблицы self.regenOstGridTable() # обновляем таблицу def regenOstGridTable(self): # метод очищает таблицу self.delete_buttons() # запуск метода delete_buttons() names = [names + 1 for names in range(0, self.table_size * self.table_size)] random.shuffle(names) # перемешивание последовательности i = 0 for j in range(0, self.table_size): for k in range(0, self.table_size): button = QPushButton(str(names[i]), self) # создаём экземпляр класса QPushButton button.setMinimumSize(QSize(90, 90)) # задаём размер кнопки # привязываем сигнал к методу on_button_clicked (используем сигнал clicked) # button.clicked.connect(self.on_button_clicked) self.m_grid_table_schulte.addWidget(button, j, k) # добавляем кнопки на раскладку i += 1 self.setLayout(self.m_grid_table_schulte) # создаём раскладку таблицей (QGridLayout) def delete_buttons(self): # удаление кнопок с таблицы if self.m_grid_table_schulte is not None: while self.m_grid_table_schulte.count(): item = self.m_grid_table_schulte.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() def set_table_size_3(self): self.table_size = 3 # размерность таблицы self.regenOstGridTable() # обновляем таблицу def set_table_size_4(self): self.table_size = 4 # размерность таблицы self.regenOstGridTable() # обновляем таблицу def set_table_size_5(self): self.table_size = 5 # размерность таблицы self.regenOstGridTable() # обновляем таблицу if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() sys.exit(app.exec_())
size_button.triggered.connect(self.m_gridTable_Schulte.set_table_size(3)) ... def set_table_size(self, count): self.table_size = count # размерность таблицы self.regenOstGridTable() # обновляем таблицу
Отредактировано Doctor_Che (Янв. 4, 2017 02:59:00)
Офлайн
Пример слота с параметром.
#!/usr/bin/env python3
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.spin = QtGui.QSpinBox(self)
self.label = QtGui.QLabel(self)
self.label.move(30, 30)
self.label.resize(100, 20)
self.spin.valueChanged[int].connect(self.slot)
self.setGeometry(500, 500, 200, 100)
self.setWindowTitle('SpinBox + LineEdit')
self.show()
def slot(self, value):
self.label.setText(str(value * 2))
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Офлайн
py.user.nextЗа пример спасибо. С ним разобрался.
Пример слота с параметром.
Офлайн
Это то же самое, только через лямбду.
#!/usr/bin/env python3
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.spin = QtGui.QSpinBox(self)
self.label = QtGui.QLabel(self)
self.label.move(30, 30)
self.label.resize(100, 20)
self.spin.valueChanged.connect(lambda: self.slot(self.spin.value()))
self.setGeometry(500, 500, 200, 100)
self.setWindowTitle('SpinBox + LineEdit')
self.show()
def slot(self, value):
self.label.setText(str(value * 2))
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Офлайн
self.btn = QPushButton() self.count = 0 self.btn.clicked,connect(self.on_click) def on_click(self): print self.count
Отредактировано vic57 (Янв. 4, 2017 18:19:44)
Офлайн
5-го нету QT есть 4-й , но не думаю что там сильно отличается.
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys import random from PyQt4.QtGui import QMainWindow, QApplication, QWidget, QGridLayout, QPushButton, QAction from PyQt4.QtCore import QSize, pyqtSignal, QBasicTimer class MainWindow(QMainWindow): setTablesSize = pyqtSignal(int) # наш сигнал и что он передает (целочисленное число) def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.m_gridTable_Schulte = OstGridTable(self) # создание экземпляра класса OstGridTable # соединяем наш сигнал и метод set_table_size екземпляра self.m_gridTable_Schulte self.setTablesSize.connect(self.m_gridTable_Schulte.set_table_size) self.setCentralWidget(self.m_gridTable_Schulte) # назначение таблицы (OstGridTable) центральным виджетом main_menu = self.menuBar() # создание экземпляра меню (строка меню) size_menu = main_menu.addMenu('Задать размер таблицы') size_button = QAction('3x3', self) size_button.setStatusTip('Создать поле размером 3x3') size_button.triggered.connect(lambda: self.setTablesSize.emit(3)) size_menu.addAction(size_button) size_button = QAction('4x4', self) size_button.setStatusTip('Создать поле размером 4x4') size_button.triggered.connect(lambda: self.setTablesSize.emit(4)) size_menu.addAction(size_button) size_button = QAction('5x5', self) size_button.setStatusTip('Создать поле размером 5x5') size_button.triggered.connect(lambda: self.setTablesSize.emit(5)) size_menu.addAction(size_button) self.show() # отображаем окно на экране class OstGridTable(QWidget): m_grid_table_schulte = QGridLayout() # создаём экземпляр класса QGridLayout def __init__(self, parent): super().__init__(parent) self.table_size = 5 # размерность таблицы self.regenOstGridTable() # обновляем таблицу def regenOstGridTable(self): # метод очищает таблицу self.delete_buttons() # запуск метода delete_buttons() names = [names + 1 for names in range(0, self.table_size * self.table_size)] random.shuffle(names) # перемешивание последовательности i = 0 for j in range(0, self.table_size): for k in range(0, self.table_size): button = QPushButton(str(names[i]), self) # создаём экземпляр класса QPushButton button.setMinimumSize(QSize(90, 90)) # задаём размер кнопки # привязываем сигнал к методу on_button_clicked (используем сигнал clicked) # button.clicked.connect(self.on_button_clicked) self.m_grid_table_schulte.addWidget(button, j, k) # добавляем кнопки на раскладку i += 1 self.setLayout(self.m_grid_table_schulte) # создаём раскладку таблицей (QGridLayout) def delete_buttons(self): # удаление кнопок с таблицы if self.m_grid_table_schulte is not None: while self.m_grid_table_schulte.count(): item = self.m_grid_table_schulte.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() def set_table_size(self, count): self.table_size = count # размерность таблицы self.regenOstGridTable() # обновляем таблицу if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() sys.exit(app.exec_())
[code python][/code]
Офлайн
PEHDOMСпасибо огромное. Теперь разобрался.
5-го нету QT есть 4-й , но не думаю что там сильно отличается.
Офлайн