Найти - Пользователи
Полная версия: помогите новичку в pyQT
Начало » GUI » помогите новичку в pyQT
1
Xaver
Проблема следующая: создал массив кнопок хочется связать их сигналы clicked() с своей функцией и передавать индексы массива кнопок или указатель на виджет вызвавшей эту функцию, но сделать этого не получается поскольку сигнатура сигнала и слота связанного с сигнала в этом случае не совпадает.
poltergeist
    self.btn1.clicked.connect(self.btn_clicked)
self.btn2.clicked.connect(self.btn_clicked)
self.btn3.clicked.connect(self.btn_clicked)

def btn_clicked(self):
btn = self.sender() # кнопка, от которой поступил сигнал
...
Xaver
на эт получаю:
AttributeError: ‘Ui_Dialog’ object has no attribute ‘sender’
poltergeist
код в студию, а вообще btn_clicked должен быть методом Qt-шного класса, и это у вас точно не выполняется.
Xaver
ну я создал форму в Designerе и потом переделал ее с помошью pyuic4 а затем переделал код под массив кнопок.

class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName(“Dialog”)
Dialog.resize(310, 310)
self.Field = (QtGui.QPushButton(Dialog), QtGui.QPushButton(Dialog),QtGui.QPushButton(Dialog)),(QtGui.QPushButton(Dialog), QtGui.QPushButton(Dialog),QtGui.QPushButton(Dialog)),(QtGui.QPushButton(Dialog), QtGui.QPushButton(Dialog),QtGui.QPushButton(Dialog))
self.Field.setGeometry(QtCore.QRect(10, 10, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(110, 10, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(210, 10, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(10, 110, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(210, 110, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(110, 110, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(10, 210, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(210, 210, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")
self.Field.setGeometry(QtCore.QRect(110, 210, 90, 90))
font = QtGui.QFont()
font.setPointSize(36)
font.setWeight(75)
font.setBold(True)
self.Field.setFont(font)
self.Field.setObjectName("Field")

self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.Field, self.Field)
Dialog.setTabOrder(self.Field, self.Field)
Dialog.setTabOrder(self.Field, self.Field)
Dialog.setTabOrder(self.Field, self.Field)
Dialog.setTabOrder(self.Field, self.Field)
Dialog.setTabOrder(self.Field, self.Field)
Dialog.setTabOrder(self.Field, self.Field)
Dialog.setTabOrder(self.Field, self.Field)
for i in range (0, 3):
for j in range (0, 3):
self.Field.clicked.connect(self.btn_clicked)

def btn_clicked(self):
btn = self.sender()

def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate(“Dialog”, “Dialog”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
self.Field.setText(QtGui.QApplication.translate(“Dialog”, “”, None, QtGui.QApplication.UnicodeUTF8))
Андрей Светлов
Ээээ.
Наглядная демонстрация принципа: зачем нам объектно-ориентированное программирование, когда есть блочное копирование!
Мощно, ничего не скажешь!
Xaver
Да я знаю что со стороны ооп эт совсем совсем не гуд но лабу прост в институт нести уже надо, а переделывать уж очень не хочется. неужели без класса который будет представлять собой виджет sender() работать не будет?
Андрей Светлов
Не будет.
.sender есть у QObject (изначально, наверное, UI_Dialog наследовался от QDialog).
Поскольку сейчас UI_Dialog - наследник object, то у него никакого .sender нет и не было никогда.
gmorgunov
Привет.
Xaver, думаю на простом примере все станет понятнее.
Итак, в дизайнере создаете простой файл proba.ui c двумя кнопками. Далее, что вы и делали pyuic4 proba.ui -o proba.py.Вот получившийся файл proba.py:
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'proba.ui'
#
# Created: Mon Sep 28 10:59:30 2009
# by: PyQt4 UI code generator 4.4.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton1 = QtGui.QPushButton(self.centralwidget)
self.pushButton1.setGeometry(QtCore.QRect(30, 30, 105, 29))
self.pushButton1.setObjectName("pushButton1")
self.pushButton2 = QtGui.QPushButton(self.centralwidget)
self.pushButton2.setGeometry(QtCore.QRect(200, 30, 105, 29))
self.pushButton2.setObjectName("pushButton2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 28))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton1.setText(QtGui.QApplication.translate("MainWindow", "PushButton1", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton2.setText(QtGui.QApplication.translate("MainWindow", "PushButton2", None, QtGui.QApplication.UnicodeUTF8))
Далее создаете файл main_proba.py, где наследуетесь от сгенерированного pyuic4 класса. И как писал poltergeist пользуете метод sender().
Файл main_proba.py:
#!/usr/bin/env python
# coding: utf-8
import sys
from proba import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Proba(QMainWindow, Ui_MainWindow): # здесь наследуетесь
def __init__(self):
QMainWindow.__init__(self)
self.setupUi(self)
self.connect(self.pushButton1, QtCore.SIGNAL("clicked()"), self.on_button_clicked)
self.connect(self.pushButton2, QtCore.SIGNAL("clicked()"), self.on_button_clicked)
def on_button_clicked(self):
button=self.sender()
print button.text()

app = QApplication(sys.argv)
w = Proba()
w.show()
app.exec_()
Проверил, код - рабочий.:)
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