Форум сайта python.su
Здравствуйте. Использую python 2.7.5, PyQt 4.8.4. (я правда совсем новичок еще).
Сейчас я могу создать окно с кнопкой, нажимая которую, выполняется какая-либо функция. (Например: инкремент числа). Но результат функции выводится на консоль. А как сделать так, чтоб он еще выводился в окно и отображался рядом с кнопкой?
Офлайн
Положите в ваше окно рядом с кнопкой QLineEdit, и вызывайте его слот setText() добавляя туда ваше число.
Офлайн
Спасибо, но как-то пока не хочет работать…
Итак, кусок кода:
z=0 def myfunc1(): global z z=z+1 print (z) def changeText(self, event): lineEdit.setText(str(z)) class Ui_Form(object): def setupUi(self, Form): Form.setObjectName(_fromUtf8("Form")) Form.resize(613, 545) self.pushButton = QtGui.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(244, 352, 111, 51)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.lineEdit = QtGui.QLineEdit(Form) self.lineEdit.setGeometry(QtCore.QRect(242, 290, 111, 20)) self.lineEdit.setObjectName(_fromUtf8("lineEdit")) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), myfunc1) QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), changeText) def retranslateUi(self, Form): Form.setWindowTitle(_translate("Form", "Form", None)) self.pushButton.setText(_translate("Form", "click me", None)) self.lineEdit.setText(_translate("Form", "functionvalue", None)) if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) Form = QtGui.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
Офлайн
vshnukrshna, функция changeText принимает 2 аргумента..
А сигнал кнопки clicked кнопки только один арг-мент передает..
И то наверное надо указывать так чтобы он передался:
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked(bool)"), changeText)
Офлайн
Итак, я более-менее разобрался и теперь все работает, но я хочу немного расширить задачу…
class MyForma1(object): def AddWidgets1(self, Form): Form.setObjectName(_fromUtf8("Form")) Form.resize(613, 545) self.pushButton = QtGui.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(244, 352, 111, 51)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.lineEdit = QtGui.QLineEdit(Form) self.lineEdit.setGeometry(QtCore.QRect(242, 290, 111, 20)) self.lineEdit.setObjectName(_fromUtf8("lineEdit")) self.retranslateUi(Form) QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.changeText) def retranslateUi(self, Form): self.pushButton.setText(_translate("Form", "Click me", None)) self.lineEdit.setText(_translate("Form", "functionvalue", None)) class MyForma2(QtGui.QDialog, MyForma1): def __init__(self, z11=0): QtGui.QDialog.__init__(self) self.AddWidgets1(self) self.z = z11 def myfunc1(self): self.z+=1 def changeText(self): self.myfunc1() self.lineEdit.setText(str(self.z)) if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) Forma = MyForma2() Forma.show() sys.exit(app.exec_())
Офлайн
При наступлении события от датчика обрабатываете его (пересчитываете функцию) и отправляете свой сигнал в lineEdit.
Офлайн
mksСпасибо, я это понимаю
При наступлении события от датчика обрабатываете его (пересчитываете функцию) и отправляете свой сигнал в lineEdit.
def myfunc1(self): self.z+=1 def changeText(self): self.lineEdit.setText(str(self.z))
QtCore.QObject.connect(<?????>, QtCore.SIGNAL(<?????>), Form.changeText)
Офлайн
vshnukrshnaЗаверните свою функцию в объект-наследник QObject определите в нём сигнал который оповещает об изменении функции. В конце метода который пересчитывает функцию вызывайте сигнал:
Т.е мне нужно, чтоб испускателем сигнала был сам факт изменения функции
self.my_function_change_signal.emit()
Офлайн
сделал простой пример: simple_signal_slot в главном окне перехвачено событие движения мыши (в вашем случае надо отслеживать событие пересчёта функции), в котором берутся текущие координаты и отправляются сигналом xy в lineEdit. Запускать main.py.
Офлайн
Зачем сигнал передавать? Этим надо заниматься если функция работает в отдельно потоке, если поток один то меняй значение прямо из функции.
def mouseMoveEvent(self, event): tmp = 'x={0} y={1}'.format(event.x(), event.y()) self.lineEdit.setText(tmp) #self.xy.emit(tmp)
Офлайн