Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 4, 2017 02:58:09

Doctor_Che
Зарегистрирован: 2017-01-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5. Передача данных в сигнале

Здравствуйте.

Не получается сделать передачу данных в сигнале.
Сделал через несколько разных методов. Подскажите как переделать в один метод, что бы в нём передавалось значение через параметр.

Сделано: 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()  # обновляем таблицу
То выдаёт ошибку:
size_button.triggered.connect(self.m_gridTable_Schulte.set_table_size(3))
TypeError: argument 1 has unexpected type ‘NoneType’

Отредактировано Doctor_Che (Янв. 4, 2017 02:59:00)

Офлайн

#2 Янв. 4, 2017 03:25:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

PyQt5. Передача данных в сигнале

Пример слота с параметром.

#!/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()



Офлайн

#3 Янв. 4, 2017 14:24:16

Doctor_Che
Зарегистрирован: 2017-01-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5. Передача данных в сигнале

py.user.next
Пример слота с параметром.
За пример спасибо. С ним разобрался.
В нём передаётся значение самого спинбокса.
Но вот приладить вызов с параметром к элементу меню так и не получается…

Офлайн

#4 Янв. 4, 2017 14:59:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

PyQt5. Передача данных в сигнале

Это то же самое, только через лямбду.

#!/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()



Офлайн

#5 Янв. 4, 2017 15:01:55

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PyQt5. Передача данных в сигнале

     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)

Офлайн

#6 Янв. 4, 2017 18:13:22

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5. Передача данных в сигнале

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_())
Хотя в вашем случае вместо (lambda: self.setTablesSize.emit(3) можно было писать
lambda: self.m_gridTable_Schulte.set_table_size(3) но возможно вас инрересует именно как работает передача парметра в сигнале..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Янв. 4, 2017 23:47:32

Doctor_Che
Зарегистрирован: 2017-01-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5. Передача данных в сигнале

PEHDOM
5-го нету QT есть 4-й , но не думаю что там сильно отличается.
Спасибо огромное. Теперь разобрался.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version