Xaver
Сен. 27, 2009 15:47:25
Проблема следующая: создал массив кнопок хочется связать их сигналы clicked() с своей функцией и передавать индексы массива кнопок или указатель на виджет вызвавшей эту функцию, но сделать этого не получается поскольку сигнатура сигнала и слота связанного с сигнала в этом случае не совпадает.
Xaver
Сен. 27, 2009 17:01:27
на эт получаю:
AttributeError: ‘Ui_Dialog’ object has no attribute ‘sender’
poltergeist
Сен. 27, 2009 21:18:12
код в студию, а вообще btn_clicked должен быть методом Qt-шного класса, и это у вас точно не выполняется.
Xaver
Сен. 28, 2009 05:52:41
ну я создал форму в 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))
Андрей Светлов
Сен. 28, 2009 06:45:30
Ээээ.
Наглядная демонстрация принципа: зачем нам объектно-ориентированное программирование, когда есть блочное копирование!
Мощно, ничего не скажешь!
Xaver
Сен. 28, 2009 07:11:08
Да я знаю что со стороны ооп эт совсем совсем не гуд но лабу прост в институт нести уже надо, а переделывать уж очень не хочется. неужели без класса который будет представлять собой виджет sender() работать не будет?
Андрей Светлов
Сен. 28, 2009 07:36:35
Не будет.
.sender есть у QObject (изначально, наверное, UI_Dialog наследовался от QDialog).
Поскольку сейчас UI_Dialog - наследник object, то у него никакого .sender нет и не было никогда.
gmorgunov
Сен. 28, 2009 11:15:23
Привет.
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_()
Проверил, код - рабочий.:)